2011-08-09 117 views
6

我試圖在Windows 7下的新環境下編譯Windows XP中的遺留代碼。它編譯但在運行時失敗。在Windows 7下的CreateProcess失敗

的CreateProcess()返回0,並且GetLastError()返回2,它代表ERROR_FILE_NOT_FOUND

這裏是我的電話給CreateProcess

STARTUPINFO StartInfo; 
memset(&StartInfo, 0, sizeof(StartInfo)); 

wcsncpy(astrCommandLine, L"TFTP", MAX_OSCOMMANDLINE_SZ-1); 
BOOL bFuncRetn = CreateProcess(NULL, 
       astrCommandLine,  // command line 
       NULL,   // process security attributes 
       NULL,   // primary thread security attributes 
       NULL,   // handles are inherited 
       0,    // creation flags 
       NULL,   // use parent's environment 
       NULL,   // use parent's current directory 
       &StartInfo,   // STARTUPINFO pointer 
       &m_ProcInfo); // receives PROCESS_INFORMATION 

現在的怪事:不是TFTP當我運行計算,鈣會彈出。我可以在命令提示符中的任何位置執行命令行中的任何命令,以便告訴我%PATH%到c:\ windows \ system32是已知的並且正常工作。

我試圖用ANSI字符串強制CreateProcessA,但我得到了相同的結果。我也嘗試在調試和發佈配置和從命令行。

有什麼想法?

編輯: calc.exe和tftp.exe都位於系統路徑中的c:\ windows \ system32中。
運行「c:\ windows \ system32 \ tftp」不起作用

+0

tftp是由應用程序路徑而不是系統路徑找到的?這可能解釋爲什麼找到calc,但tftp不是。 CreateProcess不使用應用程序路徑。我假設你在某處設置了StartInfo.cb。 –

+0

這一切都很有希望。當然tftp.exe不在您的程序的默認工作目錄中。 Calc.exe不是問題,它在PATH上。傳遞.exe的* full *路徑名,例如c:\ foo \ bar \ tfpt.exe。 –

+0

我從來沒有聽說過StartInfo.cb – Eric

回答

9

問題是您有一個32位應用程序試圖執行64位Windows命令。您不必重新編譯您的應用程序爲64位來解決問題。你所要做的就是將所有出現的c:\ windows \ system32改爲c:\ windows \ SysNative。

在Windows 7 x64中,從32位程序引用c:\ windows \ system32會自動重定向到c:\ windows \ syswow64。使用特殊別名c:\ windows \ SysNative會導致Windows 7不執行重定向。