Я использую функцию GetModuleBaseName Win Api получить имя процесса из текущего окна (мое приложение 32 бит работает на Win7 64 бит):Найти имя модуля процесса 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 где вернувшейся последней ошибкой
error 299 : ERROR_PARTIAL_COPY : "Only part of a ReadProcessMemory or WriteProcessMemory request was completed."
MSDN не описывает, почему эта конкретная ошибка может произойти. Я где-то читал, что эта ошибка может произойти для EnumProcessModulesEx из-за проблемы между 32 и 64-битными программами, но об этом не упоминается для GetModuleBaseName. Есть ли способ узнать, откуда это происходит и как его исправить?
благодаря
Примите несколько моментов, чтобы удалить дополнительный отступ в следующий раз. – sidyll
Я точно не знаю ответа, но я подозреваю, что для этого просто потребуется использовать 64-битное приложение. Если вы google для «ошибки 299 64-битного 32-битного приложения», вы обнаружите, что несколько API возвращают эту ошибку в этом типе ситуации (32-битное приложение, запрашивающее информацию из 64-битных процессов). Возможно, GetModuleBaseName использует один из тех других API, которые получают эту ошибку. –