在CreateProcess之后调用GetModuleFileNameEx时ERROR_INVALID_HANDLE
ERROR_INVALID_HANDLE when calling GetModuleFileNameEx after CreateProcess
在成功调用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。
相似的问题
相关文章:
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 如何解决"invalid conversion from 'char' to 'const char*'"
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- C++二进制到 Java 会"java.lang.Error: Invalid memory access"
- 我在检查字符串时得到"Invalid utf 8 error",但当我使用 std::cout 时似乎是正确的
- WSARecv 有时会返回与 IOCP 端口关联的套接字的"invalid handle (error no 6)"。(C++)
- 在嵌入式八度C++中如何执行脚本文件?( "error: invalid call to script" )
- 来自字符串库组件内部的"error: invalid operands to binary expression"
- "error: invalid conversion from 'int*' to 'int' function"
- 如何解决"[Error] invalid use of incomplete type 'class SLLNode'"链表
- 深度缓冲区作为纹理 - "D3D11 ERROR: The Format is invalid when creating a View"