![]() |
GetModuleHandle / hInstance
Hallo zusammen...
ähm.. irgendwie stehe ich schon wieder an :( Ich möchte an die WNDCLASS-Struktur der Klasse eines bestimmten Fensters kommen, das sicht nicht in meiner Anwendung befindet! Die funktion GetClassInfo erwartet als Parameter das Handle zu dem Module / Instanz, das die Klasse erzeugte (hInstance). Die einzige Möglichkeit, die ich gefunden habe, um an ein soches Handle zu kommen, ist die funktion GetModuleHandle!? Das ist auch schon meine erste Frage.. gibt es evtl eine andere Möglichkeit an dieses handle zu kommen? Die Funktion GetModuleHandle erwartet wiederum als Parameter den Modul Name, den ich folgendermassen erhalte:
Delphi-Quellcode:
Wenn sich das Fenster in meiner Anwendung befindet funktioniert das auch! GetModuleHandle gibt mir mit dem ModuleName das selbe Handle zurück, wie die Konstance hInstance! Wenn sich das Fenster aber nicht in meiner Anwendung befindet, gibt GetModuleHandle 0 zurück, der ModuleName stimmt aber! Auf Msdn.com habe ich folgenden Text gefunden:
function GetModuleName(wndHandle: THandle): String;
var winVersion: TOSVersionInfo; hProcess: THandle; processId: Cardinal; processEntry32: TProcessEntry32; b: Boolean; begin Result := ''; winVersion.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); GetVersionEx(winVersion); GetWindowThreadProcessId(wndHandle, @processId); if(winVersion.dwPlatformId = VER_PLATFORM_WIN32_NT) then begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, processId); if not (hProcess = INVALID_HANDLE_VALUE) then begin try SetLength(Result, 400); SetLength(Result, GetModuleFileNameEx(hProcess, 0, PChar(Result), Length(Result))); finally CloseHandle(hProcess); end; end; end else begin hProcess := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if not (hProcess = INVALID_HANDLE_VALUE) then begin try processEntry32.dwSize := SizeOf(processEntry32); b := Process32First(hProcess, processEntry32); while b do begin if processEntry32.th32ProcessID = processId then begin result := String(processEntry32.szExeFile); Break; end; b := Process32Next(hProcess, processEntry32); end; finally CloseHandle(hProcess); end; end; end; end; Zitat:
Hat jemand von euch evtl. schon mal so etwas gemacht! Vielen Dank für eure Hilfe und Grüsse.. Dominic |
Re: GetModuleHandle / hInstance
Versuch mal GetWindowLong mit dem Flag GWL_HINSTANCE.
Nachtrag: Der Pfad eines Moduls ist nur innerhalb eines Prozesses eindeutig. Die Funktion parst durch die Speicherseiten und versucht zu ermitteln wo das Modul gemappt ist. Außerdem erscheint das logisch, wenn man sich vorstellt, daß WinWord.EXE auch 99 mal laufen kann ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz