2012-02-04 88 views
3

我有以下的測試代碼:的CreateProcess和0xc0000142錯誤

#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; 
} 

這僅僅是在窗口創建過程中的測試代碼。問題是,當我啓動「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; 
} 

因此,任何想法?

+0

見http://support.microsoft.com/kb/960266 – 2012-02-04 16:28:48

回答

3

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獲取lpProcessAttributeslpThreadAttributes的參數。

+0

這個工作。非常感謝! – ExusTheOne 2012-02-04 16:35:01

0

這個答案是涉及另一個原因0xc0000142 - 放在這裏,因爲沒有關於此錯誤的intertubes很少有用的信息(即使另一個答案被接受了這個問題) - 和一個令人震驚的缺乏任何有關微軟主題的有用信息 - 所以某人的互聯網搜索可能會讓他們在這裏。 (嗯,我的確如此。)

所以:你可以得到The application was unable to start correctly (0xc0000142)開始一個用C++編寫的進程,你可以在靜態對象的構造函數中訪問一個空指針。 (在我的情況下,它是在一個靜態對象的構造函數的初始化程序中)。

您對此的提示將是應用程序日誌中的事件(事件ID 1000源「應用程序錯誤」),它具有類似於以下:

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

0xc0000005是訪問衝突,當然,和0(實際上任何小於0x10000偏移量是通過一個空指針的引用。

無論如何,令人吃驚的事情(我)是評估靜發生前的調試器可以連接(!!),所以使用Visual Studio中ImageFileExecutionOptions集,甚至直接啓動它不會讓你調試這個東西! !

(然後當然,你不會找到任何微軟的文檔在任何0xc0000142。幹得好,NT團隊!)

相關問題