Проблема перезапуска exe - PullRequest
2 голосов
/ 11 июля 2009

Мне нужно перезапустить программу, над которой я работаю, после загрузки обновления, за исключением того, что я столкнулся с некоторыми проблемами.

Если я использую CreateProcess, то ничего не происходит, если я использую ShellExecute, я получаю ошибку 0xC0150002 и если я использую ShellExecute с командой "runas", она работает нормально. Я могу нормально запустить командную строку, используя CreateProcess и ShellExecute, но не тот же exe-файл, и не хочу использовать runas, так как это повысит его.

Есть идеи?

Windows 7, visual studio 2008 c ++

альтернативный текст http://lodle.net/shell_error.jpg

CreateProcess:

char exePath[255];
GetModuleFileName(NULL, exePath, 255);

size_t exePathLen = strlen(exePath);
for (size_t x=exePathLen; x>0; x--)
{
    if (exePath[x] == '\\')
        break;
    else
        exePath[x] = '\0';
}


char name[255];
GetModuleFileName(NULL, name, 255);

PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};

BOOL res = CreateProcess(name, "-wait", NULL, NULL, false, 0, NULL, exePath, &StartupInfo, &ProcInfo );

ShellExecute:

char exePath[255];
GetModuleFileName(NULL, exePath, 255);

size_t exePathLen = strlen(exePath);
for (size_t x=exePathLen; x>0; x--)
{
    if (exePath[x] == '\\')
        break;
    else
        exePath[x] = '\0';
}

char name[255];
GetModuleFileName(NULL, name, 255);

INT_PTR r = (INT_PTR)ShellExecute(NULL, "runas", name, "-wait", exePath, SW_SHOW);

Ответы [ 4 ]

2 голосов
/ 11 июля 2009

CreateProcess () - загадочный зверь. Я с недоумением помню свои первые разочарования в связи с этим. Вы должны взглянуть на Пример Microsoft CreateProcess и Страница CreateProcess . (эти ссылки, вероятно, имеют короткий срок службы, Googling CreateProcess также должен работать).

Я вижу 3 проблемы в вашем коде.

StartupInfo должен иметь «cb» установленный размер структуры:

STARTUPINFO StartupInfo = {0};
StartupInfo.cb = sizeof(StartupInfo);

Второй аргумент требует, чтобы команда и аргументы формировали командную строку. Ваша программа увидит «-wait» как argv [0] и проигнорирует его или не обращает на это внимания.

char command[512];
sprintf(command, "%s -wait", name);
BOOL res = CreateProcess(name, command, // and as you had before

Вы не смотрите на GetLastError (), если CreateProcess () завершается с ошибкой (возвращая ноль). Возможно, это помогло вам, но я подозреваю, что это просто скажет «неверный аргумент» или что-то в этом роде. Эй, есть только 10 из них, чтобы проверить, не ленитесь: -)

Еще одна ошибка, которую я совершил, не закрывает дескрипторы hProcess и / или hThread, возвращаемые в PROCESS_INFORMATION, когда я это сделал. Я делал hProcess, но не hThread.

1 голос
/ 11 июля 2009

Что произойдет, если вы запустите процесс с помощью system ()? Это дает вам меньше контроля, но вы будете запускать его из того же контекста, в котором вы работаете. Кроме того, попробуйте следить за запуском второго процесса с помощью ProcMon, он может дать вам подсказку, необходимую вам в отношении источника ошибки .

1 голос
/ 11 июля 2009

Выглядит как манифест или вопрос реестра, судя по коду ошибки. Если вы не можете получить фактическую строку сообщения об ошибке для получения более подробной информации, вы можете попробовать:

  • перемещение каждого возможного файла манифеста (Microsoft.VC80.CRT.manifest и т. П.) В каталог вашего exe-файла, чтобы обеспечить доступность
  • полностью и полностью удалите / сотрите старые версии DLL, в которых у вас могут быть установщики более новых версий (я советую: удалить КАЖДУЮ версию, очистить реестр с помощью инструмента очистки, такого как Norton, переустановить новый материал с нуля)
0 голосов
/ 11 июля 2009

Хорошо, в конце концов все получилось.

При первом запуске моего exe-файла он использовал пути по умолчанию и в качестве такового загружал vld (dll детектора утечки) из пути по умолчанию. Однако в exe я изменил путь к dll, чтобы он был папкой bin ([app] \ bin), когда я перезапустил exe с помощью CreateProcess, он поднял его на другой vld dll (это была моя ошибка), которая имела неправильное параллельное соединение и только после просмотра средства просмотра событий я понял это.

Спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...