können dll´s das aufrufende programm erkennen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
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 »

Kaeru Gaman hat geschrieben: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)
:?:
Ne, Instance ist das hModule!
Einfach einer neuen, globalen Variable zuordnen.
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 »

also ganz easy

Code: Alles auswählen

Global HostHandle.i = Instance
:?:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Mastermar
Beiträge: 6
Registriert: 11.04.2010 23:12

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

Beitrag von Mastermar »

Ja jetzt fühle ich mich richtig mißverstanden. Ich male das also mal etwas aus:

Es gibt beispielsweise 4 Prozesse, die auch dasselbe Programm sein können, die häufig auf die DLL zugreifen.
Die dll ist sozusagen das Spielfeld, die Plattform, auf der das Programmierspiel abläuft.
Wenn also eine Funktion aufgerufen wird, muß der aufrufende Prozeß jedes mal identifiziert werden, nicht nur
einmalig beim attachen, weil wie gesagt auch ein Programm mehrmals gestartet werden könnte und als Cheat-Schutz.

Also Prozeß 1 und 2 sind angenommen dasselbe Programm, 2x gestartet. Prozeß 1 möchte .. einen Panzer bauen, Prozeß 2 möchte eine Kanone bauen. Die Baufunktion muß nun die Befehle dem aufrufenden Prozeß jedes mal zuordnen können, sonst entsteht ein fröhliches Chaos. Dafür reicht in diesem Fall der Programmname nicht, das Prozeßhandle wäre dagegen eindeutig.
Soweit ich verstanden habe (habe keinerlei Erfahrung mit dll-Programmierung) wird die attach Funktion nur beim ersten Aufruf durchlaufen, bietet also keine Identifizierung jedes weiteren Aufrufes. Die Übertragung von _Instance als Parameter jedes Funktionsaufrufes könnte gefaked werden, darum möchte ich sie vermeiden. Ich suche wirklich die anscheinend nicht naheliegende Möglichkeit,
den aufrufenden Prozeß bei jedem Funktionsaufruf zu identifizieren und der Name reicht dafür nicht, was mir erst im Verlauf hier klar wurde. Vielleicht geht ja auch wirklich nicht, was ich brauche, aber ich kann es mir nicht vorstellen.

Übrigens begeistert es mich, wie schnell und engagiert hier geantwortet wird. Leider ist PB ziemlich anders aufgebaut als mein geliebtes GFA32, sonst wäre ich schon deswegen einfach eben mal umgestiegen. Das kann allerdings noch passieren.

Nochmals Danke für die vielen Antworten!

Mastermar
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 »

Die DLL wird nur einmal geladen und jede Instance, die die DLL lädt, erhöht nur den
Reference-Zähler, wenn diese bereits geladen wurde. Beim Laden wird die oben
genannte Procedure automatisch aufgerufen, der Name steht Dir also zur Verfügung.
Der Wert ist für jede Instance entsprechend anders bestückt!

Du wurdest nicht mißverstanden, Du verstehst bloß die DLL nicht :mrgreen:
PB-Hilfe hat geschrieben:Nur für fortgeschrittene Programmierer: es gibt 4 spezielle Prozeduren, die von Windows automatisch aufgerufen werden, wenn eines der folgenden Ereignisse auftritt:

- DLL wurde zu einem neuen Prozess hinzugefügt
- DLL wurde von einem Prozess entfernt
- DLL wurde zu einem neuen Thread hinzugefügt
- DLL wurde von einem Thread entfernt

Um diese Ereignisse zu verwalten, ist es möglich, 4 spezielle Prozeduren zu deklarieren: AttachProcess(Instanz), DetachProcess(Instanz), AttachThread(Instanz) und DetachThread(Instanz). Dies bedeutet, dass diese 4 Prozedur-Namen reserviert sind und vom Programmierer nicht für andere Zwecke verwendet werden können.
http://www.purebasic.com/german/documen ... e/dll.html
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 »

deine Sorge ist völlig unbegründet.
beim Attachen wird dieser Instanz der DLL der aufrufende Prozess bekanntgemacht.
das haben wir dir nun gezeigt, wie man das in Globale Variablen packt, sowohl den Namen als auch das Handle.
innerhalb jeder deiner Funktionen deiner DLL kannst du jetzt auf diese Globale Variablen zugreifen und erfährst damit,
von welchem Prozess diese Funktion aufgerufen wird, weil das ja logischer Weise innerhalb der selben Instanz liegt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

Ja, Mist!
Ich hatte vorgestern noch bemerkt, dass ich Unsinn geredet habe, weil die von mir gepostete Prozedur den DLLName zurückgibt und nicht den, des aufrufenden Programms.
Dann hatte ich gesehen, dass Rings das offensichtlich in Ordnung gebracht hat und habe es einfach dabei belassen.

Merke für die Zukunft:
Wenn schon Unsinn schreiben, dann aber auch rechtzeitig wieder klarstellen!
Antworten