2012-04-05 2 views
1

Я использую функцию 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. Есть ли способ узнать, откуда это происходит и как его исправить?

благодаря

+0

Примите несколько моментов, чтобы удалить дополнительный отступ в следующий раз. – sidyll

+0

Я точно не знаю ответа, но я подозреваю, что для этого просто потребуется использовать 64-битное приложение. Если вы google для «ошибки 299 64-битного 32-битного приложения», вы обнаружите, что несколько API возвращают эту ошибку в этом типе ситуации (32-битное приложение, запрашивающее информацию из 64-битных процессов). Возможно, GetModuleBaseName использует один из тех других API, которые получают эту ошибку. –

ответ

3

Documentation for GetModuleBaseName предполагает, что вызов GetProcessImageFileName или QueryFullProcessImageName будет более надежным, чем вызов GetModuleBaseName с модулем NULL ручкой.

Смежные вопросы