| Autor |
Beitrag |
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Do 09.08.07 11:31
Hallo!
In einer DLL möchte ich RegisterClass ausführen. Dazu brauche ich aber die Instance der Anwendung. Da die DLL später aus C# aufgerufen werden soll (per DLLImport), habe ich von der Anwendung her Schwierigkeiten, dieses Handle zu bekommen.
Gibt es eine Möglichkeit, dieses Handle auch in der dll selber zu bekommen?
Gruß
alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Fr 10.08.07 01:19
alias5000 hat folgendes geschrieben: | Hallo!
In einer DLL möchte ich RegisterClass ausführen. Dazu brauche ich aber die Instance der Anwendung. Da die DLL später aus C# aufgerufen werden soll (per DLLImport), habe ich von der Anwendung her Schwierigkeiten, dieses Handle zu bekommen.
Gibt es eine Möglichkeit, dieses Handle auch in der dll selber zu bekommen?
Gruß
alias5000 |
Probier mal GetCurrentProcess. Keine Garantie für irgendwas.
Gruss Reinhard
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 10.08.07 12:01
Einzige (für mich im Moment gangbar erscheinende) Möglichkeit ist, im Environment-Block den EXE-Pfad der Anwendung auszulesen und dann mit VirtualQueryEx über die Speicherbereiche zu iterieren und mit GetModuleName abzugleichen, welches Modul wo liegt und darüber das Modul der EXE zu suchen.
Ach ja: GetCurrentProcess liefert die Prozess-ID, nicht das Instanz-Handle.
Ach ja: LoadLibrary könnte auch noch ein Ansatz sein, allerdings weiß ich nicht, wie Windows darauf reagiert, wenn man eine EXE als DLL loaded.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
alias5000 
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Fr 10.08.07 12:36
ich hab grad nicht viel Zeit, daher antworte ich jetzt nur sporadisch, aber schonmal danke für die Hinweise bis jetzt
BenBE hat folgendes geschrieben: | | Einzige (für mich im Moment gangbar erscheinende) Möglichkeit ist, im Environment-Block den EXE-Pfad der Anwendung auszulesen und dann mit VirtualQueryEx über die Speicherbereiche zu iterieren und mit GetModuleName abzugleichen, welches Modul wo liegt und darüber das Modul der EXE zu suchen. |
Sowas hattest du mir per ICQ ja schon vorgeschlagen, bin bisher noch dran gescheitert, aber ich möchte es erstmal versuchen selbst hinzubekommen
BenBE hat folgendes geschrieben: | | Ach ja: LoadLibrary könnte auch noch ein Ansatz sein, allerdings weiß ich nicht, wie Windows darauf reagiert, wenn man eine EXE als DLL loaded. |
Ich nehme an, dass die ERP Components mit LoadLibrary arbeiten. Und dann funktioniert das ganz normal, hab da mal mit gespielt.
Allerdings handelt es sich bei meiner Exe um eine mit verwaltetem Code (C# Projekt halt). Ich weiß nicht, wie das da aussieht
Gruß
alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
AHT
      
Beiträge: 207
|
Verfasst: Do 16.08.07 15:26
Hallo alias5000...
Es geht um die Ladeadresse/Basisadresse des Prozesserzeugenden Moduls - richtig?
Unter NT basierenden Systemen lässt sich das über das Auslesen meherer Pointer direkt aus dem Speicher des jeweiligen Prozesses lesen. Desweiteren ist unter NT basierenden Systemen der Prozesserzeuger immer das erste Modul, das von Module32First gelistet wird.
Welches OS?
Gruß
AHT
|
|
alias5000 
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Sa 18.08.07 01:35
Eigentlich auch 98/ME.
Aber ich habs zumindest vorläufig ganz anders gelöst-
D.h. ich kann jetzt hier auch nciht meine Lösung dazu posten, weil ich das innerhalb eines ganz anderen Kontextes mit gelöst habe.
Trotzdem werd ich ggfs. später nochmal auf diesen Thread zurückkommen.
Vielen Dank Reihardt, Benny und AHT
gruß
alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
Steve1024
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: Sa 25.08.07 17:44
Hast du schon mal GetModuleHandle versucht?
Sowas wie:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var vH : THandle; vN : String; begin vH := GetModuleHandle(ParamStr(0)); vN := GetModuleName(vH); end; |
Das ganze sollte hoffe ich so funktionieren.
Des weiteren hat Delphi noch eine Speicher Tabelle, in welcher es alle geladenen Module verwaltet (somit auch deine Host-App). Hatte damit mal zu tun... beinhaltet glaube ich PModule records oder so...
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: So 26.08.07 11:53
GetModuleHandle(nil) gibt beim Aufruf innerhalb der Dll die Ladeadresse (Instance) der Anwendung zurück.
Wenn ich das jetzt so richtig verstanden habe (in Bezug auf den letzten Post)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Steve1024
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: So 26.08.07 12:20
Also so viel ich weiss gibt GetModuleHandle(nil) das Handle der aktuellen DLL wieder zurück (also den Wert von hInstance). Wenn man den Parameter ParamStr(0) einfügt sollte das Handle der Host-Anwendung kommen (also z.B. RunDll32.exe).
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: So 26.08.07 15:25
GetModuleHandle(nil) gibt immer das ausführende Modul zurück (die Exe)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Steve1024
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: So 26.08.07 16:56
gut... habe es leider noch nie so ausprobiert.
|
|
|