Einzelnen Beitrag anzeigen

bayo

Registriert seit: 19. Aug 2003
Ort: ch
15 Beiträge
 
Delphi 5 Enterprise
 
#1

GetModuleHandle / hInstance

  Alt 23. Aug 2003, 20:47
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
  Mit Zitat antworten Zitat