Autor Beitrag
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Fr 10.08.07 01:19 
user profile iconalias5000 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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 :)

user profile iconBenBE 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 ;)

user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 207



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Sa 25.08.07 17:44 
Hast du schon mal GetModuleHandle versucht?
Sowas wie:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var vH : THandle; vN : String;
begin
  // Handle/hInstance of the requested file
  vH := GetModuleHandle(ParamStr(0));
  // complete filename of the requested handle
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: So 26.08.07 16:56 
gut... habe es leider noch nie so ausprobiert.