Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 03.11.2013
Сообщений: 2

CreateProcess, не запускается с ярлыка, если рабочая папка в ярлыке не указана или указана другая

03.11.2013, 22:43. Показов 1419. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите, кто знает начинающему программисту. вот написал такой код для загрузчика другой программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
char* startDIR = new char[MAX_PATH];
STARTUPINFO si;
PROCESS_INFORMATION pi;
 
memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
 
GetCurrentDirectory(MAX_PATH, startDIR);
SetCurrentDirectory(startDIR);
strncat(startDIR, "\\start.exe", strlen(startDIR) + strlen("\\start.exe") + 1);
 
if ( CreateProcess(startDIR, lpCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
{
dword = WaitForSingleObject(pi.hProcess, INFINITE);
if( dword == WAIT_OBJECT_0 )
{
MessageBox(NULL, "..GUT...", "Meldung", MB_OK);
 
}
else if ( dword == WAIT_ABANDONED )
{
MessageBox(NULL, "....NCHT GUT...", "Meldung", MB_OK);
 
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
вроде как все правильно, вроде все работает и дебаггер ошибок не выдает. но все работает до определенного момента. т.е. если я создаю ярлык на загрузчик и изменяю в ярлыке рабочую папку, загрузчик перестает загружаться. и дебаггер молчит. если я пишу в CreateProcess("с:\\...",..., то все работает нормально. но меня так не устраивает, т.к. загружаемые программы, загрузчик и рабочие папки находятся в разных местах. т.е. start.exe загружает файлы с другой папки, не там где сам находится. а если в CreateProcess(startDIR,.... то не загружается. не еще так делаю CreateProcess((const char*)startDIR,...не помогает. помогите пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2013, 22:43
Ответы с готовыми решениями:

Неправильно указана рабочая папка, прорвете PIF файл
При запуске паскаля(TURBO.EXE)выбивается и пишет "неправильно указана рабочая папка прорвете PIF файл"что делать??? через ярлык...

Если в скобках указана команда или переменная, тогда их обязательно надо использовать при выполнении задания
Если в скобках указана команда или переменная, тогда их обязательно надо использовать при выполнении задания. Ввести в файл...

Если в файле указана не цифра 5, выполнить действие
Здравствуйте. Поправьте код >nul find /i "5" < "1.txt" && start "" "2.txt" в итоге нужно получить если в 1.txt файле написано не...

2
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
04.11.2013, 03:50
Вам тогда нужно получать путь не через GetCurrentDirectory(), а непосредственно через путь к исполняемому файлу.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Используйте, по возможности, статические массивы.
//char* startDIR = new char[MAX_PATH];
char startDIR[MAX_PATH];
STARTUPINFO si;
PROCESS_INFORMATION pi;
 
// Обнулять PROCESS_INFORMATION нет необходимости.
// memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
 
//GetCurrentDirectory(MAX_PATH, startDIR);
//SetCurrentDirectory(startDIR);
//strncat(startDIR, "\\start.exe", strlen(startDIR) + strlen("\\start.exe") + 1);
GetModuleFileName(0, startDIR, MAX_PATH);
GetFullPathName(startDIR, MAX_PATH, startDIR, 0);
// Если файл лежит в корне диска, путь будет заканчиваться символом '\\'.
// В противном случае, последний символ - не '\\'.
// Это распространяется и на GetCurrentDirectory().
// Если пользоваться strcat, это следует предварительно проверить.
// Лучше, наверное, было бы пользоваться PathAppend().
// Но можно поступить проще:
 
if ( CreateProcess("start.exe", lpCmdLine, NULL, NULL, FALSE, 0, NULL, startDIR, &si, &pi) )
//if ( CreateProcess(startDIR, lpCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
{
dword = WaitForSingleObject(pi.hProcess, INFINITE);
if( dword == WAIT_OBJECT_0 )
{
MessageBox(NULL, "..GUT...", "Meldung", MB_OK);
 
}
else if ( dword == WAIT_ABANDONED )
{
MessageBox(NULL, "....NCHT GUT...", "Meldung", MB_OK);
 
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
Добавлено через 25 минут
Когда отвечал, показалось, что вы пишете о ярлыке на ваш исполняемый файл, а не на файл start.exe.
Тогда для надежности надо проверять, что у вас, - start.exe или ярлык на него, - через IShellLink. Возможно, есть еще варианты, пусть остальные форумчане напишут.
0
0 / 0 / 1
Регистрация: 03.11.2013
Сообщений: 2
05.11.2013, 22:39  [ТС]
Когда отвечал, показалось, что вы пишете о ярлыке на ваш исполняемый файл, а не на файл start.exe.
Тогда для надежности надо проверять, что у вас, - start.exe или ярлык на него, - через IShellLink. Возможно, есть еще варианты, пусть остальные форумчане напишут.
нет, нет, все правильно ярлык на мой loader.exe, который запускает другой файл start.exe.
я создаю ярлык на мой loader.exe, который должен запускть start.exe. указываю в ярлыке нужную рабочую папку. и вот тут у меня происходит проблема с запуском моего loader.exe.
спасибо большое за ответ! сейчас попробую.

Добавлено через 12 часов 16 минут
mytilus, так вообще не запускается loader.exe у меня. и коммпилятор ошибку не выдает. целиком скопировал, без правки и всеравно не запускается.

Добавлено через 20 часов 52 минуты
вот этот код помог.
C++
1
2
3
4
GetModuleFileName(0, startDIR, MAX_PATH);
PathRemoveFileSpec(startDIR); //Shlwapi.lib
strcat(startDIR,"\\start.exe");
if (CreateProcess(startDIR,...)) ...
mytilus спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.11.2013, 22:39
Помогаю со студенческими работами здесь

Как в XAML изменить толщину границы DataGridHeader, если до этого она указана в шаблоне?
Задаю в App.xaml шаблон для DataGridHeader (чтобы он применился ко всему приложению) <Application...

Как css сделать так,что если в <img...> не указана картинка,то он показывал ту,которую я укажу?
Как с помощью css сделать так,что если в &lt;img...&gt; не указана картинка,то он показывал ту,которую я укажу?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru