成功調用CreateProcess後,我試圖使用GetModuleFileNameEx(lpApplicationName和lpCommandLine參數可能會變化或爲null,因此它們在這種情況下不可靠)獲取創建的進程的路徑。 問題在於GetModuleFileNameEx因錯誤6(ERROR_INVALID_HANDLE)而失敗,並將其緩衝區保留爲無效數據。我無法理解原因,因爲CreateProcess成功並且處理句柄應該在pi.hProcess中正確保存。當CreateProcess調用GetModuleFileNameEx後ERROR_INVALID_HANDLE
希望你能提前一點點亮一下,謝謝!
編輯:更新:我注意到,刪除CREATE_SUSPENDED也可以解決這個問題,但我需要該標誌集。我能怎麼做?
// Defining GetModuleFileNameExA function
typedef DWORD (WINAPI *fGetModuleFileNameExA)
(
HANDLE hProcess,
HMODULE hModule,
LPSTR lpFilename,
DWORD nSize
);
//Load dinamically DLL function on program startup:
fGetModuleFileNameExA _GetModuleFileNameExA = (fGetModuleFileNameExA) GetProcAddress(LoadLibraryA("Psapi.dll"), "GetModuleFileNameExA");
// **** OTHER UNRELATED CODE HERE ****
PROCESS_INFORMATION pi;
//This call succeeds
if (!CreateProcessW(ApplicationName,
CommandLine,
NewProcess.lpProcessAttributes,
NewProcess.lpThreadAttributes,
NewProcess.bInheritHandles,
CREATE_SUSPENDED | CREATE_NEW_CONSOLE,
NULL,
CurrentDirectory,
&NewProcess.bufStartupInfo,
&pi)
) MessageBoxA(0, "Error creating process", "", 0);
char ProcessPath[MAX_PATH];
//Problem here: call fails with error 6
if (!_GetModuleFileNameExA(pi.hProcess, NULL, ProcessPath, MAX_PATH)) {GetLastError();}
//Invalid data is displayed
MessageBoxA(0, ProcessPath, "GetModuleFileNameEx",0);
刪除'CREATE_SUSPENDED'似乎是解決 –
如果要創建暫停,那麼就沒有模塊信息又是因爲你沒有給進程一個機會加載任何模塊。 –
由於你顯然沒有爲'CreateProcessW'的第一個參數傳遞NULL,你不知道可執行文件的文件名嗎? –