Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetModuleHandle / hInstance (https://www.delphipraxis.net/7887-getmodulehandle-hinstance.html)

bayo 23. Aug 2003 19:47


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:
  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;
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:

Zitat:

The GetModuleHandle function retrieves a module handle for the specified module if the file has been mapped into the address space of the calling process.
Ich denke, dass es nicht funktioniert, weil die Datei nicht in meinem Process "gemappt" ist aber... ich weiss nicht, wie ich das machen kann!?

Hat jemand von euch evtl. schon mal so etwas gemacht!

Vielen Dank für eure Hilfe und Grüsse.. Dominic

Assarbad 23. Aug 2003 20:01

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 10:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz