CreateProcess не работает на всех приложениях - PullRequest
0 голосов
/ 14 июня 2011

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

CreateProcess(FullPathOfExternalApp.c_str(), NULL, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, 0, 0, &siStartupInfo, &piProcessInfo)

Возможно ли, что внешнее приложение имеет встроенный механизм, предотвращающий его выполнение другим исполняемым файлом?

Спасибо большоемного

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Я бы начал с получения последней системной ошибки, а затем отформатировал ее и выгрузил, что-то вроде:

std::string getSystemErrorMsg()
{
    LPVOID lpMsgBuf;
    ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );

    std::string err = reinterpret_cast<const char *>( lpMsgBuf );

    ::LocalFree( lpMsgBuf );

    return err;
}

Я бы вызвал такую ​​функцию сразу после сбоя CreateProcess, а затем передал бы строку с ошибкой в ​​ OutputDebugString () и использовал бы что-то вроде DebugView для мониторинга вывода. Иногда ОС может дать вам понять, почему она не будет делать то, что вы ожидаете, не всегда, но я бы, по крайней мере, начал там.

1 голос
/ 14 июня 2011

Нет ничего особенного в использовании CreateProcess() для запуска программы.Ваша проблема в другом месте.Это может быть 64-битный исполняемый файл в 32-битной системе (не запускается), в нем могут отсутствовать зависимости, это может быть что-то еще, связанное со средой.Лучше всего использовать утилиту Process Monitor для проверки наиболее вероятных причин.

...