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 ビット プログラムで正常に動作しますが、最後のエラーが返された MSPaint などの 64 ビット プログラムでは動作しません。

エラー 299 : ERROR_PARTIAL_COPY : 「ReadProcessMemory の一部のみまたは
WriteProcessMemory リクエストが完了しました。」

MSDN には、この特定のエラーが発生する理由が記載されていません。32ビットプログラムと64ビットプログラムの間の問題により、このエラーがEnumProcessModulesExで発生する可能性があることをどこかで読みましたが、GetModuleBaseNameについてはそのようなことは言及されていません。これがどこから来ているのかを知る方法とそれを修正する方法はありますか?

ありがとう

4

1 に答える 1

3

GetModuleBaseName のドキュメントでは、NULL モジュール ハンドルを使用して GetModuleBaseName を呼び出すよりも、GetProcessImageFileName または QueryFullProcessImageName を呼び出す方が信頼性が高いことが示唆されています。

于 2012-04-05T22:04:01.730 に答える