CreateProcess后调用GetModuleFileNameEx时,ERROR_INVALID_HANDLE

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

希望您能提前一点,谢谢!

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

Solutions Collecting From Web of "CreateProcess后调用GetModuleFileNameEx时,ERROR_INVALID_HANDLE"

从MSDN上的CreateProcess文档 :

请注意,该函数在过程完成初始化之前返回。 如果所需的DLL不能定位或初始化失败,则该过程终止。 要获得进程的终止状态,请调用GetExitCodeProcess

调用线程可以使用WaitForInputIdle函数等待,直到新进程完成其初始化,并等待用户输入没有输入悬而未决。 这对父进程和子进程之间的同步很有用,因为CreateProcess不等待新进程完成初始化就返回。 例如,创建过程将在尝试查找与新过程相关联的窗口之前使用WaitForInputIdle。

类似的问题