首页 文章

在CreateProcess之后调用GetModuleFileNameEx时的ERROR_INVALID_HANDLE

提问于
浏览
1

在成功调用CreateProcess之后,我试图使用GetModuleFileNameEx获取所创建进程的路径(lpApplicationName和lpCommandLine参数可以变化或为null,因此在这种情况下它们不可靠) . 问题是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);

1 回答

  • 2

    来自MSDN上的CreateProcess documentation

    请注意,该函数在进程初始化之前返回 . 如果找不到所需的DLL或初始化失败,则终止该过程 . 要获取进程的终止状态,请调用GetExitCodeProcess . ...调用线程可以使用WaitForInputIdle函数等待新进程完成初始化并等待没有输入挂起的用户输入 . 这对于父进程和子进程之间的同步很有用,因为CreateProcess在不等待新进程完成初始化的情况下返回 . 例如,在尝试查找与新进程关联的窗口之前,创建进程将使用WaitForInputIdle .

    Similar question

相关问题