2013-05-12 9 views
0

Вот мой код. Я всегда получаю ошибку 3, что я могу сделать? Я попытался заменить CreateProcces на CreateProcessA, заменив первый два параметра, попробуйте обработать другую программу, но она все еще не работает. Спасибо.CreateProcess, winapi, код ошибки 3

#include "windows.h" 
    #include <iostream> 

    void main() { 

    STARTUPINFOA cif; 
    ZeroMemory(&cif,sizeof(cif)); 
    PROCESS_INFORMATION pi; 
    CreateProcessA("","C:\\Windows\\notepad.exe",NULL,NULL, NULL,NULL,NULL,NULL,&cif,&pi); 

    DWORD error=GetLastError(); 
    std::cout << "error " << error << "\n"; 
    while(1) {}  // подождать 
} 

Да, вы прав. Я исправил его, но он все еще возвращает код ошибки 3. Во-первых, notepad.exe не выполняется, во-вторых, getlasteeror возвращает ошибку кода 3, что я сделал не так?

I место:

 char* path="C:\\Windows\\notepad.exe"; 
     CreateProcessA(path,"sfvfd",NULL,NULL,NULL,NULL,NULL,NULL,&cif,&pi); 

вместо (и это сработало!):

 CreateProcessA("","C:\\Windows\\notepad.exe",NULL,NULL,    
     NULL,NULL,NULL,NULL,&cif,&pi); 

В чем разница?

+0

Ваш тест немного странный. 'CreateProcess' возвращает ненулевое значение, если оно преуспевает, поэтому вам будет лучше потерять' == TRUE'. – ChrisF

+0

Откуда вы знаете, что это не удается? Вы не проверяете возвращаемое значение. – paulm

+0

@paulm Во-первых, notepad.exe не выполняется, во-вторых, getlasteeror возвращает ошибку кода 3, что я сделал не так? – Robert

ответ

1

попробуйте этот код из примера MSDN

#include <windows.h> 
#include <stdio.h> 


void main() 
{ 
    STARTUPINFOA si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    // Start the child process. 
    if(!CreateProcessA(NULL,  // No module name (use command line) 
    "C:\\Windows\\notepad.exe", // Command line 
    NULL,   // Process handle not inheritable 
    NULL,   // Thread handle not inheritable 
    FALSE,   // Set handle inheritance to FALSE 
    0,    // No creation flags 
    NULL,   // Use parent's environment block 
    NULL,   // Use parent's starting directory 
    &si,   // Pointer to STARTUPINFO structure 
    &pi)   // Pointer to PROCESS_INFORMATION structure 
    ) 
    { 
    printf("CreateProcess failed (%d).\n", GetLastError()); 
    return; 
    } 

    // Wait until child process exits. 
    WaitForSingleObject(pi.hProcess, INFINITE); 

    // Close process and thread handles. 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
+0

спасибо, это тоже работает – Robert

2

Это well documented on MSDN, если вы читали внимательно:

Первый аргумент lpApplicationName:

Имя модуля, который будет выполнен. [...]

Параметр lpApplicationName может быть NULL. В этом случае имя модуля должно быть первым символом, ограниченным пробелом в строке lpCommandLine. [...]

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

Вы однако передаете указатель не NULL на пустую строку. Таким образом, API не будет выбирать ваш путь к блокноту и вместо этого пытается запустить пустую строку.

Nence, 3 = ERROR_PATH_NOT_FOUND «Система не может найти указанный путь».

+0

да, вы прав, спасибо – Robert

Смежные вопросы