Createprocess и ошибка 0xc0000142 - PullRequest
       18

Createprocess и ошибка 0xc0000142

4 голосов
/ 04 февраля 2012

У меня есть следующий тестовый код:

#define CMDLINE ".\\dummyFolder\\dummyProc.exe op1 op2 op3"

int main(int argc, char **argv) {

STARTUPINFO info;
info.cb = sizeof(STARTUPINFO);
info.lpReserved = NULL;
info.cbReserved2 = 0;
info.lpReserved2 = NULL;

PROCESS_INFORMATION processInfo;

SECURITY_ATTRIBUTES procAttr;
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
procAttr.lpSecurityDescriptor = NULL;
procAttr.bInheritHandle = false;

SECURITY_ATTRIBUTES threadAttr;
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
procAttr.lpSecurityDescriptor = NULL;
procAttr.bInheritHandle = false;

bool handlersInheritable = true;

char cmdLine2[sizeof(CMDLINE)];
strcpy(cmdLine2, CMDLINE);

char AppName[sizeof(".\\dummyFolder\\dummyProc.exe")];
strcpy(AppName, ".\\dummyFolder\\dummyProc.exe");


if (CreateProcess(AppName, cmdLine2, &procAttr, &threadAttr,
        handlersInheritable, 0, NULL, NULL, &info, &processInfo)) {

    //::WaitForMultipleObjects(procQty, handlers, waitForAll, waitInterval);
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
    CloseHandle(info.hStdError);
    CloseHandle(info.hStdInput);
    CloseHandle(info.hStdOutput);
} else {
    std::cout << "Returned: " << GetLastError() << std::endl;
}

std::cout << "Exiting main process" << std::endl;

return 0;
}

Это всего лишь тестовый код для создания процессов в Windows.Проблема в том, что когда я запускаю "dummyProc.exe", я получаю ошибку 0xc0000142.

Процесс dummyProc.exe работает нормально из командной строки, но не из кода.

Вот код dummyProc, если он помогает:

int main(int argc, char **argv) {


std::cout << "Working!!!!" << std::endl << "Receivedi: " << std::endl;

for (int i = 0; i < argc; ++i)
    std::cout << argv[i] << std::endl;


return 0;
}

Итакесть идеи?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

Самое очевидное, что char cmdLine2[sizeof(CMDLINE)]; объявляет строку длины, равную размеру указателя вашего компьютера.Вам нужно использовать strlen(CMDLINE)+1 вместо этого.Аналогично для appName.

Обратите внимание, что первый параметр CreateProcess не должен быть доступен для записи.Просто передайте строковый литерал непосредственно ему.Нет необходимости в переменной appName.

Что касается lpCommandLine, который должен быть доступен для записи, это проще всего сделать так:

char cmdline[] = "op1 op2 op3";

Это дает вам буфер для записи.Обратите внимание, что вам не нужно повторять имя исполняемого файла.

Другая проблема заключается в том, что вы не инициализировали все параметры для CreateProcess.Например, структура STARTUPINFO имеет 19 полей, и вы инициализируете только 3. Вы должны инициализировать все свои структуры в 0, а затем заполнить все поля, которые должны быть ненулевыми.Например:

STARTUPINFO info = { 0 };

Сделайте это для всех пройденных вами структур.

Вы можете и должны передавать NULL для параметров lpProcessAttributes и lpThreadAttributes.

2 голосов
/ 19 марта 2017

Этот ответ связан с другой причиной для 0xc0000142 - помещенной здесь (даже если для этого вопроса был принят другой ответ), потому что на вставках очень мало полезной информации об этой ошибке - и шокирующее отсутствие из любой полезной информации по этому вопросу от Microsoft - и поэтому чей-то поиск в Интернете может получить их здесь. (Ну, мой сделал.)

Итак: вы можете получить The application was unable to start correctly (0xc0000142) при запуске процесса, написанного на C ++, где вы получаете доступ через нулевой указатель в конструкторе статического объекта. (В моем случае это было в инициализаторе конструктора статического объекта.)

Ваш намек на это будет событием в журнале приложения (идентификатор события 1000 источник «Ошибка приложения»), в котором есть строки, подобные следующим:

Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000
Exception code: 0xc0000005
Fault offset: 0x0000000000000000

0xc0000005 - это, конечно, нарушение доступа, а смещение 0 (фактически любое значение, меньшее 0x10000, является ссылкой через нулевой указатель.

В любом случае, удивительно (для меня), что оценка статики происходит за до , которую отладчик может подключить (!!), поэтому запуск его с установленным ImageFileExecutionOptions или даже непосредственно в Visual Studio не позволяет ты отлаживаешь эту штуку !!

(И, конечно, вы не найдете 0xc0000142 в какой-либо документации Microsoft. Отлично, команда NT!)

...