2009-03-26 6 views
2
//window is an HWND 
LPWSTR path = new WCHAR[1024]; 
DWORD size = 1024; 

GetWindowText(window, path, 1024); 

HINSTANCE instance = (HINSTANCE)GetWindowLongPtr(window, GWLP_HINSTANCE); 

QueryFullProcessImageName(instance, PROCESS_NAME_NATIVE, path, &size); 

Dieser Code schlägt beim Aufruf von QueryFullProcessImageName (...) mit dem Fehlercode 6 [ungültiges Handle] fehl. GetWindowText ist erfolgreich und GetWindowLong gibt einen HININANCE ungleich Null zurück.QueryFullProcessImageName fehlgeschlagen mit gültigem HINSTANCE?

Ich bin ziemlich neu zu win32, also warum das nicht funktioniert, ist über mich hinaus. Ich glaube, dass sowohl die HWND und HINSTANCE beteiligt sind gültig ...

Dank

Antwort

5

Hauptproblem:

Für die Funktion: QueryFullProcessImageName, der erste Parameter nicht ein HINSTANCE ist, ist es der Prozess Griff . Sie sind anders. Um die aktuelle Prozess-ID zu erhalten, sollten Sie GetCurrentProcessId verwenden. Dann übergeben Sie das in OpenProcess, um den Prozess zu erhalten.


Anderes Problem:

Sie GetWindowLongPtr oben statt GetWindowLong verwendet werden sollen. Die Verwendung von GetWindowLong würde wahrscheinlich Probleme auf x64-Systemen verursachen.


So finden Sie heraus, was Ihr Problem nicht allein ist:

Nachdem die meisten Win32-Funktionen fehlschlagen, können Sie den Grund, warum unter Verwendung von GetLastError erfahren.

So nach dem Aufruf QueryFullProcessImageName bitte dies tun:

DWORD dwLastError = GetLastError(); 
LPVOID lpMsgBuf; 
std::string strErrorMessage; 
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); 
if (lpMsgBuf) 
{ 
    strErrorMessage = (const TCHAR*)lpMsgBuf; 
    LocalFree(lpMsgBuf); 
} 

Sie können auch anrufen einfach nur GetLastError() und lookup its return value here.

+0

Frage entsprechend aktualisiert. Das Problem besteht jedoch weiterhin. –

+0

@Kevin Montrose: Ich aktualisierte mit dem Grund, warum –

+0

Festcode: DWORD processID = 0; \t GetWindowThreadProcessId (Fenster & Prozess-ID); \t HANDLE processHandle = OpenProcess (PROCESS_QUERY_LIMITED_INFORMATION, false, processID); QueryFullProcessImageName (processHandle, PROCESS_NAME_NATIVE, Pfad, &size); Danke. –

Verwandte Themen