【发布时间】:2014-07-21 11:23:42
【问题描述】:
在成功调用 CreateProcess 后,我尝试使用 GetModuleFileNameEx 获取创建的进程的路径(lpApplicationName 和 lpCommandLine 参数可以变化或为空,因此在这种情况下它们不可靠)。 问题是 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);
【问题讨论】:
-
删除
CREATE_SUSPENDED似乎是解决方案 -
如果你创建了暂停,那么还没有模块信息,因为你没有给进程加载任何模块的机会。
-
既然您显然没有为
CreateProcessW的第一个参数传递NULL,您难道不知道可执行文件的文件名吗?