Aktuelle Zeit: 18.11.2017 16:02

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 33 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 16.08.2017 20:04 
Offline
Benutzeravatar

Registriert: 30.03.2010 15:24
Achso, das ist gemeint. Aber ok, ist ein Funktionsaufruf außerhalb einer Procedure().

_________________
PureBasic 5.24 LTS (Windows x86/x64) | Windows7 SP1 x64 | windows 10 x64 Anniversary Bug


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 18.08.2017 12:51 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
_JON_ hat geschrieben:
Achso, das ist gemeint. Aber ok, ist ein Funktionsaufruf außerhalb einer Procedure().


Ich bin da auch gerade drüber gestolpert....
Bis ich dann das
Code:
EndProcedure : InitModule()

nicht mehr "überlesen" habe....

_________________
PureBasic 5.45 LTS / 5.61 (Windows x86/x64) | Windows10 Pro x64 | Z87-PLUS | i7 4770k | 32GB RAM | iChill GeForce GTX 980 X4 Ultra | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 18.08.2017 13:20 
Offline

Registriert: 29.08.2004 13:18
Bisonte hat geschrieben:
Bis ich dann das
Code:
EndProcedure : InitModule()

nicht mehr "überlesen" habe....


<hust> das ist aber auch böse....

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 18.08.2017 13:26 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
mk-soft hat geschrieben:
Die Procedure InitModule() wir vor den Aufruf der Procedure AttachProcess(Instanse) bei Dll´s aufgerufen.
Funktioniert sicher.

Code:
DeclareModule MyModule
  ;TODO
EndDeclareModule

Module MyModule
 
  Procedure InitModule()
    Debug "Init My Module!"
    ;TODO
  EndProcedure : InitModule()
 
EndModule


Würde ich nie so machen. Sinn und Zweck der Regeln ist doch, dass beim laden der DLL nicht unkontrolliert Code ausgeführt wird. Da nützt es auch nichts, dass du das in eine Prozedur verpackst. Kann gut gehn oder auch nicht, sicher ist das auf jeden Fall nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 18.08.2017 13:36 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Sorry, ich schreibe das immer so wenn ich eine Initialisierungsroutine schreibe.

Somit sind keine Funktionsaufrufe außerhalb von Prozeduren und es gibt keine Stackprobleme bei Dll´s.

Einfach mal eine ASM-Output als DLL erstellen. Dann sieht man in welcher Reihenfolge die Prozeduren verarbeitet werden.
Zitat:
;
; PureBasic 5.60 (Windows - x64) generated code
;
; (c) 2016 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; :DLL
; :System
; kernel32.lib
; :Import
;
format MS64 COFF
;
;
extrn GetModuleHandleW
extrn HeapCreate
extrn HeapDestroy
extrn memset
public _PB_Instance
public PB_ExecutableType
public PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public PB_EndFunctions
public _DLLEntryPoint@12
public _Procedure2

macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}

macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }

;
section '.code' code readable executable align 4096
;
;
_DLLEntryPoint@12:
SUB rsp,40
CMP rdx,1
JNE .SkipProcessAttach
MOV [_PB_Instance],rcx
CALL PB_DllInit
MOV rcx,[_PB_Instance]
CALL _Procedure2
JMP .End
.SkipProcessAttach:
CMP rdx,2
JNE .SkipThreadAttach
JMP .End
.SkipThreadAttach:
CMP rdx,0
JNE .SkipProcessDetach
CALL _PB_EOP
JMP .End
.SkipProcessDetach:
CMP rdx,3
JNE .SkipThreadDetach
.SkipThreadDetach:
.End:
MOV rax,1
ADD rsp,40
RET
;
PB_DllInit:
SUB rsp,40
XOR r8,r8
MOV rdx,4096
XOR rcx,rcx
CALL HeapCreate
MOV [PB_MemoryBase],rax

; DeclareModule MyModule
;
; EndDeclareModule
;
; Module MyModule
;
CALL _Procedure0
;
; EndModule
;
;
ADD rsp,40
RET
_PB_EOP:
SUB rsp,40
CALL PB_EndFunctions
MOV rcx,[PB_MemoryBase]
CALL HeapDestroy
ADD rsp,40
RET
PB_EndFunctions:
SUB rsp,40
ADD rsp,40
RET
;
; ProcedureDLL AttachProcess(Instance)
_Procedure2:
MOV qword [rsp+8],rcx
PS2=48
SUB rsp,40
;
; EndProcedure
_EndProcedureZero3:
XOR rax,rax
_EndProcedure3:
ADD rsp,40
RET
; Procedure InitModule()
_Procedure0:
PS0=48
SUB rsp,40
; Debug "Init My Module!"
;
; EndProcedure : InitModule()
_EndProcedureZero1:
XOR rax,rax
_EndProcedure1:
ADD rsp,40
RET
;
section '.data' data readable writeable
;
_PB_DataSection:
PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
pb_public PB_Compiler_Unicode
dd 1
pb_public PB_Compiler_Thread
dd 0
pb_public PB_Compiler_Purifier
dd 0
pb_public PB_Compiler_Debugger
dd 0
PB_ExecutableType: dd 0
pb_align 8
pb_align 8
pb_align 8
s_s:
dq 0
dq -1
pb_align 8
;
section '.bss' readable writeable
_PB_BSSSection:
pb_bssalign 8
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rq 1
_PB_Instance:
PB_Instance: rq 1
PB_ExitCode: rq 1
;
pb_bssalign 8
PB_DataPointer rq 1
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:


Bei ProcessAttach von der DLL wird als erstes die Procedure PB_DllInit aufgerufen. In dieser werden nach der initialisierung die Module aufgerufen.
Danach wird, wenn vorhanden, die Procedure AttachProcess aufgerufen.

_________________
Alles ist möglich, fragt sich nur wie...
Projekte EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 18.08.2017 14:07 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
Egal wie du es verpackst. Du schreibst in der DLL Code außerhalb von Prozeduren, was einfach nicht erlaubt ist. Ob das in allen Situationen funktioniert, in zukünftigen Windows-Versionen, in nicht PB-Programmen die deine DLL aufrufen sei dahingestellt.

Im übrigen bleibt es vollkommen egal, ob du deinen Code direkt ausführst oder in einer Prozedur versteckst. Er wird immer als erster vor AttachProcess() ausgeführt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 19.08.2017 00:34 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Es wird kein Code ausserhalb von Prozeduren geschrieben!

Laden der DLL
ProcessAttach:
-> Call PB_DLLInit()
--> Call Own InitModule()
<-- Ret
<- Ret
-> Call AttachProcess(), wenn angelegt
<- Ret

War schon immer so.

_________________
Alles ist möglich, fragt sich nur wie...
Projekte EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 19.08.2017 09:44 
Offline

Registriert: 29.08.2004 13:18
Josh hat geschrieben:
Ob das in allen Situationen funktioniert, in zukünftigen Windows-Versionen, in nicht PB-Programmen die deine DLL aufrufen sei dahingestellt.


Also die Situationen kann man ausschließen. Selbst ein Windows-Update oder ein Nicht-PB-Programm das eine PB-DLL aufruft, da wird sich nichts ändern. Außer irgendwas anderes in PB ruft eine Inkompatibilität auf

Allerdings ist es möglich, das in Zukünftigen PB-Versionen es anders gehandhabt wird und es dann nicht mehr läuft, da es nicht dokumentiert ist. Das muss man definitiv in Hinterkopf behalten.

Allerdings sollte der PB-Compiler imo eigentlich eine Fehlermeldung schmeißen, wenn bei einer DLL Programmcode außerhalb einer Procedure ist und nicht einfach einen ungültigen Code erstellen.

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 19.08.2017 10:11 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
GPI hat geschrieben:
Allerdings ist es möglich, das in Zukünftigen PB-Versionen es anders gehandhabt wird und es dann nicht mehr läuft, da es nicht dokumentiert ist.

Es ist dokumentiert, aber eben, dass es nicht erlaubt ist:

Help hat geschrieben:
Hinweise zur Erstellung von DLL's:
- Die Deklaration von Arrays, Listen bzw. Maps mittels Dim, NewList bzw. NewMap muss stets innerhalb der Prozedur AttachProcess erfolgen.
- Schreiben Sie keinen Programmcode außerhalb von Prozeduren. Als Ausnahmen erlaubt sind lediglich Variablen- oder Strukturen-Deklarationen.
- DirectX Initialisierungsroutinen dürfen nicht innerhalb der AttachProcess Prozedur geschrieben werden.


Auch wenn es mk-soft anders sieht, es wird definitiv Code außerhalb von Prozeduren ausgeführt, selbst wenn ich nur den Befehl InitModule() betrachte. Damit wird auch Code innerhalb der Prozedur ausgeführt, wobei ich hier die Prozedur nur als hübsche Verpackung betrachte.

Eine DLL soll für das Hauptprogramm Prozeduren zur Verfügung stellen und nicht eigenen Code ausführen, was InitModule() definitiv macht. Wenn in InitModule() ebenfalls nur Variablen- oder Strukturen-Deklarationen stehen, sollte es kein Problem sein.

Aber egal, kann eh jeder machen wie er denkt :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Interface - Fragen
BeitragVerfasst: 19.08.2017 10:58 
Offline

Registriert: 29.08.2004 13:18
Was nicht dokumentiert ist, das PB die Befehle bei einer DLL außerhalb von Proceduren sammelt und dann in die ProcessAttach() packt. Also da wo es eigentlich hin gehört. Probleme machen wahrscheinlich Sachen wie "define variable=12390" weil das gleichzeitig eine Definition und Befehl ist.

Die Dokumentation ist hier definitiv veraltet. Und imo sollte der Compiler einen Fehler schmeißen, wenn man was unerlaubtes macht.

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 33 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye