können dll´s das aufrufende programm erkennen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Mastermar
Beiträge: 6
Registriert: 11.04.2010 23:12

können dll´s das aufrufende programm erkennen?

Beitrag von Mastermar »

ich bin neu hier, komme von gfa32 und ich will mich an eine dll-programmierung trauen.
die dll wird von verschiedenen programmen aufgerufen und ich möchte gerne, daß
die dll zB den handle des aufrufenden programmes erkennt, gibt es diese möglichkeit?

vielen dank für antwort!

christian böttgenbach
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: können dll´s das aufrufende programm erkennen?

Beitrag von HeX0R »

Hiermit z.B. bekommst du den Dateinamen inklusive Pfad der Host-Datei:

Code: Alles auswählen

ProcedureDLL AttachProcess(Instance)
	Protected a$
	
	a$ = Space(#MAX_PATH)
	GetModuleFileName_(Instance, @a$, #MAX_PATH)
	MessageRequester("FileName", "Filename of Host: " + a$)
EndProcedure
Einfach in deine DLL pappen...
Mastermar
Beiträge: 6
Registriert: 11.04.2010 23:12

Re: können dll´s das aufrufende programm erkennen?

Beitrag von Mastermar »

Danke Hexor!

Ich war nicht deutlich genug, es geht mir um die Erkennung des aufrufenden Programmes,
ohne daß dafür ein Parameter übertragen werden muß.

Noch konkreter: Hier entsteht ein Programmierspiel, bei dem die Programme eine DLL aufrufen.
Ich möchte nun unterscheiden können, welches Programm die DLL aufruft, ohne daß dafür
bei jedem Befehl ein _Instance oder sonstiger Parameter mitgeliefert werden muß, sonst kommt
noch ein Schlaumeier daher und schickt von einer Fake-instance Befehle ;) Außerdem würde ich
gerne vermeiden, daß bei jedem Befehl ein Parameter mehr mit übertragen werden muß.

Kennt jemand die Lösung, wie ich bei einem DLL aufruf den aufrufenden Prozeß erkennen kann?

Christian Böttgenbach
Benutzeravatar
Rings
Beiträge: 978
Registriert: 29.08.2004 08:48

Re: können dll´s das aufrufende programm erkennen?

Beitrag von Rings »

Code: Alles auswählen

 a$ = Space(#MAX_PATH)
 GetModuleFileName_(0, @a$, #MAX_PATH)
 MessageRequester("FileName", "Filename of Host: " + a$)
Rings hat geschrieben:ziert sich nich beim zitieren
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Re: können dll´s das aufrufende programm erkennen?

Beitrag von a14xerus »

Mastermar hat geschrieben:
Ich war nicht deutlich genug, es geht mir um die Erkennung des aufrufenden Programmes,
ohne daß dafür ein Parameter übertragen werden muß.
Noch konkreter: Hier entsteht ein Programmierspiel, bei dem die Programme eine DLL aufrufen.
Ich möchte nun unterscheiden können, welches Programm die DLL aufruft, ohne daß dafür
bei jedem Befehl ein _Instance oder sonstiger Parameter mitgeliefert werden muß, sonst kommt
noch ein Schlaumeier daher und schickt von einer Fake-instance Befehle ;) Außerdem würde ich
gerne vermeiden, daß bei jedem Befehl ein Parameter mehr mit übertragen werden muß.
Habe grad kein PB, aber soweit ich weiß ist ProcedureDLL AttachProcess(Instance) eine Procedure die automatisch beim laden der DLL aufgerufen wird, ohne das das program selber dazu etwas übertragen oder aufrufen muss.

aber laut Rings gehts ja auch mit 0, anstatt instance als modulhandle ;)
Mastermar
Beiträge: 6
Registriert: 11.04.2010 23:12

Re: können dll´s das aufrufende programm erkennen?

Beitrag von Mastermar »

Danke, Rings!

jetzt bin ich dran mit testen, die Idee ist genau was ich suchte!

Christian Böttgenbach
Mastermar
Beiträge: 6
Registriert: 11.04.2010 23:12

Re: können dll´s das aufrufende programm erkennen?

Beitrag von Mastermar »

Ich habe es ausprobiert, Rings Beispiel funktioniert und liefert mit die Namen der aufrufenden Prozesse einwandfrei.

Ich dachte dann, wenn ich es mit getmodulehandle() versuche, könnte ich das handle des Prozesses auch
bekommen, aber das funktioniert nicht, ich erhalte immer nur denselben Wert

Code: Alles auswählen

 i=GetModuleHandle_(NULL)
Also habe ich wohl etwas falsch gemacht?

Es entsteht nämlich hier das Problem, daß auch dasselbe Programm in mehreren instanzen die dll aufrufen könnte und daher der Name nicht eindeutig ist. Für die vorgesehene Anwendung ist das sogar recht wahrscheinlich.

Vielen Dank also und falls jemand noch eine Idee zur Verbesserung (Prozeßerkennung) hätte, gerne!

Mastermar
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: können dll´s das aufrufende programm erkennen?

Beitrag von Kaeru Gaman »

dann lies dir Alex' post nochmal durch, das erklärt dir, warum die Lösung von Hexor dir schon helfen sollte.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: können dll´s das aufrufende programm erkennen?

Beitrag von ts-soft »

Wie HeX0r sagte, einfach reinpappen und gut. Hab mal ne kleine Änderung reingemacht:

Code: Alles auswählen

ProcedureDLL  AttachProcess(Instance)
   Global HostFileName.s
   
   HostFileName = Space(#MAX_PATH)
   GetModuleFileName_(Instance, @HostFileName, #MAX_PATH)
EndProcedure
Jetzt haste, ohne Aufrufen irgendeiner Funktion, den Namen in der Variablen
HostFileName verfügbar.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: können dll´s das aufrufende programm erkennen?

Beitrag von Kaeru Gaman »

yo, jetzt bau ihm noch das GetModuleHandle mit rein, dann isser happy.

ich schätz mal, einfach zusätzlich

Code: Alles auswählen

Global HostHandle.i
HostHandle = GetModuleHandle_(Instance)
:?:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten