在CreateProcess之后调用GetModuleFileNameEx时ERROR_INVALID_HANDLE

ERROR_INVALID_HANDLE when calling GetModuleFileNameEx after CreateProcess

本文关键字:ERROR INVALID HANDLE GetModuleFileNameEx CreateProcess 之后 调用      更新时间:2023-10-16

在成功调用CreateProcess后,我试图使用GetModuleFileNameEx (lpApplicationName和lpCommandLine参数可以变化或为空,因此在这种情况下它们不可靠)获得创建进程的路径。问题是GetModuleFileNameEx失败,错误6 (ERROR_INVALID_HANDLE),使其缓冲区中留下无效数据。我无法理解原因,因为CreateProcess成功了,进程句柄应该已经正确地保存在pi.hProcess中。

希望你能有所启发,提前感谢!

EDIT:更新:我注意到删除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);

来自MSDN上的CreateProcess文档:

注意该函数在进程完成初始化之前返回。如果无法找到所需的DLL或初始化失败,则终止该进程。要获取进程的终止状态,请调用GetExitCodeProcess

调用线程可以使用WaitForInputIdle函数等待,直到新进程完成初始化并等待用户输入,没有输入挂起。这对于父进程和子进程之间的同步非常有用,因为CreateProcess返回时不需要等待新进程完成初始化。例如,创建进程在尝试查找与新进程关联的窗口之前,将使用WaitForInputIdle。

相似的问题

相关文章: