Seite 1 von 1

[GELÖST] Code außerhalb von ProcedureDLL

Verfasst: 19.11.2016 01:41
von es_91
Hi.

Warum sollte in einer DLL oder .so, etc. außerhalb von ProcedureDLL kein Code geschrieben werden? Was passiert, wenn man es doch tut?

Wo gibt es Engpässe, die PB Hilfe schweigt sich dazu leider etwas aus . . .

Danke

Re: Code außerhalb von ProcedureDLL

Verfasst: 19.11.2016 06:56
von Imhotheb
Also wirklich Wissen darüber habe ich nicht. Aber eine Vermutung... es gibt einfach keinen Grund ausführbaren Code außerhalb von Prozeduren zu schreiben ... Eine Dll ist eine Sammlung von Funktionen / Prozeduren... Für das "automatische Ausführen" gibts ja die 4 speziellen Prozeduren (Attach.../Detach... Zumindest bei Windows).

Habe es selbst nie ausprobiert. Denke aber das, vorausgesetzt der Compiler meckert nicht, alles oder nichts passieren kann. Also entweder der Code wird nie ausgeführt und nur Speicher verschwendet bis zu IMAs an nicht nachvollziehbaren Stellen.

Aber wie bereits erwähnt, alles nur Vermutung, andere können da bestimmt mehr dazu sagen.

Re: Code außerhalb von ProcedureDLL

Verfasst: 19.11.2016 10:28
von MenschMarkus
Eine DLL nichts anderes als eine Sammlung von Prozeduren, welche du einmal geschrieben hast und immer wieder als Library verwenden kannst. Alle diese Prozeduren kannst du einzeln aufrufen um diese auszuführen. Womit die Frage eigentlich schon beantwortet wird. Dadurch, dass Du nur Code innerhalb der aufgerufenen ProzedurDLL ausführst, würde Code außerhalb von Prozeduren niemals zur Ausführung kommen. Es macht also keinen Sinn Code außerhalb von Prozeduren zu schreiben.

Re: Code außerhalb von ProcedureDLL

Verfasst: 19.11.2016 10:35
von Sicro
Darüber habe ich kürzlich im englischem Forum ebenfalls nachgefragt:
How are DLLs correctly programmed?

Re: Code außerhalb von ProcedureDLL

Verfasst: 19.11.2016 11:44
von MenschMarkus
Im Zusammenhang zu diesem Kontext mal folgendes Beispiel

Code: Alles auswählen

Procedure InnerProcedure(value1.i, value2.i)
    Protected result.i
    result = value1 + value2
    ProcedureReturn result
endprocedure

ProcedureDLL calculate()
    Protected retval.i
    retval = InnerProcedure(10,15)
    ProcedureReturn retval
endprocedure
 
Ist es in DLLs zulässig eine Operation in eine "innere" Prozedur (hier: InnerProceduer()) zu kapseln und als Prozeduraufruf in der aufrufbaren Prozedur (hier: calculate()) zu verwenden?
Funktionieren tut es zwar, aber ist die Vorgehensweise korrekt so?

Re: Code außerhalb von ProcedureDLL

Verfasst: 19.11.2016 12:03
von es_91
Notes about creating DLL's:

- The declaration of arrays, lists or map with Dim, NewList or NewMap must always be done inside the procedure AttachProcess.
- Don't write program code outside procedures. The only exception is the declaration of variables or structures.
- DirectX initialization routines must not be written in the AttachProcess procedure.
Hinweise zur Erstellung von DLLs:

- Arrays, Listen oder Maps werden über Dim, NewList oder NewMap innerhalb der Prozedur "AttachProcess" erledigt
- Außerhalb von Prozeduren kein Programmcode! Ausnahme: Deklaration von Variablen oder Strukturen
- Keine DirectX-Initialisierungen innerhalb von "AttachProcess"!


Demnach wird nur der deklarative Teil außerhalb von DLL-Prozeduren berücksichtigt. Allerdings verarbeitet eine DLL außerhalb ihrer Prozeduren offenbar auch includeFile () und dataSection/endDataSection, ebenso kann man dort eine MessageBox ausführen. Das bringt mich zu der Vermutung, dass sämtlicher Code außerhalb von Prozeduren gültig ist. Er sollte nur nicht dort stehen, da er systemunkonform IMMER ausgeführt wird, während eine DLL nur initialisieren soll, wenn sie einem Thread oder Process angehangen wird und beides soll unterscheidbar sein.

Aber gehen tut es...

@MenschMarkus: Möglicherweise ja, warum eigentlich nicht?

@Sicro: Danke.

Re: Code außerhalb von ProcedureDLL

Verfasst: 23.11.2016 18:14
von DarkSoul
Doch, er führt den außenliegenden Code aus....

DLL's sind meines Wissens auch nur EXE-Dateien, nur ohne eigenen Programmeinstieg - aber immerhin ausführbar. Also quasi ausgelagerte Procedure()-Blöcke.

Wenn du also Code außerhalb machst, wird der sofort ausgeführt, wenn die Bibliothek geladen worden ist. Also noch bevor irgendeine Funktion aufgerufen wird. Wäre doof.

Besser ist es imho, dafür eine InitXYZ()-Funktion einzubauen, wenn AttachProcess nicht geeignet ist. Die Funktion wird im einbindenden Programm aufgerufen.

Ist mir mal versehentlich passiert und ich habe mich über komische Bugs im Hauptprogramm gewundert, bis ich endlich dahinter gekommen bin, dass ich zwischen zwei Prozedure()-Blöcke gerutscht bin und die betreffende Lib immer gleich zu Beginn geladen wurde. :lol:

[GELÖST] Code außerhalb von ProcedureDLL

Verfasst: 27.11.2016 23:13
von es_91
DarkSoul hat geschrieben:DLL's sind [...] auch nur EXE-Dateien, nur ohne eigenen Programmeinstieg - aber immerhin ausführbar.

Wenn du also Code außerhalb machst, wird der sofort ausgeführt, wenn die Bibliothek geladen worden ist.
Das sagt eigentlich alles. Danke. :D