[GELÖST] Code außerhalb von ProcedureDLL

Anfängerfragen zum Programmieren mit PureBasic.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

[GELÖST] Code außerhalb von ProcedureDLL

Beitrag 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
Zuletzt geändert von es_91 am 27.11.2016 23:13, insgesamt 1-mal geändert.
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Code außerhalb von ProcedureDLL

Beitrag 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.
weil einfach einfach einfach ist ... mach' ich es anders
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Code außerhalb von ProcedureDLL

Beitrag 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.
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Code außerhalb von ProcedureDLL

Beitrag von Sicro »

Darüber habe ich kürzlich im englischem Forum ebenfalls nachgefragt:
How are DLLs correctly programmed?
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Code außerhalb von ProcedureDLL

Beitrag 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?
Wissen schadet nur dem, der es nicht hat !
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Code außerhalb von ProcedureDLL

Beitrag 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.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Code außerhalb von ProcedureDLL

Beitrag 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:
Bild
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

[GELÖST] Code außerhalb von ProcedureDLL

Beitrag 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
Antworten