在成功调用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 回答
来自MSDN上的CreateProcess documentation:
Similar question