1

我正在使用 Win Api 函数 GetModuleBaseName 从当前窗口中检索进程名称(我的应用程序是在 Win7 64 位上运行的 32 位):

HWND Handle = GetForegroundWindow();
DWORD lpdwProcessId;
HANDLE PID; 

WCHAR ProcessName[1024];
GetWindowThreadProcessId(Handle,&lpdwProcessId);
PID=OpenProcess(PROCESS_ALL_ACCESS,false,lpdwProcessId);
if (PID)
{
    if(GetModuleBaseName(PID,NULL,ProcessName,sizeof ProcessName) == 0) {
        wcscpy(ProcessName,  L"??");
        DWORD er = GetLastError();
        printf("error code: %i\n", GetLastError());
    }
}
else
{
    wcscpy(ProcessName,  L"??");
} 

此代码适用于所有 32 位程序,但不适用于 64 位程序,例如 MSPaint,其中返回的最后一个错误是

错误 299:ERROR_PARTIAL_COPY:“仅 ReadProcessMemory 的一部分或
WriteProcessMemory 请求已完成。”

MSDN 没有记录为什么会发生此特定错误。我在某处读到,由于 32 位和 64 位程序之间的问题,EnumProcessModulesEx 可能会发生此错误,但 GetModuleBaseName 没有提到这样的事情。有没有办法知道这是从哪里来的以及如何解决它?

谢谢

4

1 回答 1

3

Documentation for GetModuleBaseName suggests that calling GetProcessImageFileName or QueryFullProcessImageName will be more reliable than calling GetModuleBaseName with a NULL module handle.

于 2012-04-05T22:04:01.730 回答