Seite 1 von 2
(Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 01:11
von String
Kann mir eventuell bitte jemand bestätigen und erklären, warum der Befehl
CloseLibrary hier zum Error führt.
Ich bekomme jedes Mal wenn ich CloseLibrary einbinde einen Fehler.
(Lesefehler an der Adresse xxxxxxxx)
Getestet auf Win8 64Bit
Vielleicht ist es ja einfach nur zu spät und ich muss eine Nacht drüber schlafen.
Ja liegt wohl auch an der
InitSprite()
Aber warum?
GoDLL.dll
Code: Alles auswählen
ProcedureDLL MyFunction1()
InitSpriteX.l = InitSprite()
MessageRequester("DLL", "DLL Ende" , 0)
ProcedureReturn InitSpriteX.l
EndProcedure
Test Programm
Code: Alles auswählen
If OpenLibrary(0, "GoDLL.dll")
InitSpriteX.l = CallFunction(0,"MyFunction1")
;CloseLibrary(0)
EndIf
MessageRequester("OK", "Programm Ende" , 0)
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 01:31
von Regenduft
Ich habe da im Hinterkopf, dass DirectX-Aufrufe nicht in DLLs und Threads ausgelagert werden dürfen. Sicher bin ich mir aber nicht. Ziemlich sicher bin ich mir allerdings, dass man Init und "zugehörige Funktionen" nicht über mehrere DLLs und/oder Hauptprogramm versteuen sollte (falls Du das evtl. machst).
PS: Solltest auch bedenken, dass die Sprite-Library nicht die einzige ist, welche DirectX nutzt (zum Thema "versteuen")
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 01:53
von STARGÅTE
InitSprite() gibt eine Integer zurück, keine Long! Also bitte überall .i machen!
Nächste Schwachstelle ist CallFunction(), benutze hier lieber Import.
Ich behaupte mal, du darfst CloseLibrary() garnicht aufrufe, denn mit deiner MyFunction1() funktion und der darin enthaltenen InitSprite() werden Ressourcen in der DLL erstellt, auf die das Hauptprogramm zugreifen muss.
CloseLibrary() killt diese Ressourcen und das Hauptprogramm steht dumm da.
Also lieber Import:
Code: Alles auswählen
Import "GoDLL.lib"
MyFunction1()
EndImport
MyFunction1()
MessageRequester("OK", "Programm Ende" , 0)
.lib ist nur fürs kompilieren, danach reicht die DLL wie normal.
InitSprite() usw. kann durchaus ausgelagert werden, nur muss dann alles ausgelagert werden (OpenScreen, LoadSprite, Display usw.)
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 02:15
von Regenduft
STARGÅTE hat geschrieben:InitSprite() usw. kann durchaus ausgelagert werden, nur muss dann alles ausgelagert werden (OpenScreen, LoadSprite, Display usw.)
Und vermutlich alle "DX-Sachen" zusammen, oder? (also z.B.
InitSprite(),
InitKeyboard() usw.)
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 02:36
von STARGÅTE
Ja klar, InitKeyboard() funktioniert ja nur bei geöffnetem Screen, und dieser kann wiederum nur aus der DLL geöffnet werden, wenn dort InitSprite und die Sprites angezeigt werden sollen.
Hier mal ein Beispiel:
Code meiner MyScreen.dll:
Code: Alles auswählen
ProcedureDLL.i Open(WindowID.i, Width.i, Height.i)
If InitSprite()
ProcedureReturn OpenWindowedScreen(WindowID, 0, 0, Width, Height, 0, 0, 0)
EndIf
EndProcedure
ProcedureDLL Show()
ClearScreen(0)
If StartDrawing(ScreenOutput())
DrawText(0, 0, "Hello World from DLL", $FFFFFF, 0)
StopDrawing()
EndIf
FlipBuffers()
EndProcedure
ProcedureDLL.i Close()
CloseScreen()
EndProcedure
Code meiner PB-Datei, die diese DLL nutzen kann:
Code: Alles auswählen
Import "MyScreen.lib"
Open(WindowID.i, Width.i, Height.i)
Show()
Close()
EndImport
Enumeration
#Window
EndEnumeration
OpenWindow(#Window, 0, 0, 800, 600, "ScreenTitle", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Open(WindowID(#Window), WindowWidth(#Window), WindowHeight(#Window))
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
Close()
End
Case #PB_Event_None
Break
EndSelect
ForEver
Show()
ForEver
Auch hier weiterhin beachten, ich kann keine Sprite in der Hauptdatei laden (die "kennt" den Screen nicht). Auch hier muss das Sprite in der DLL geladen werden und angezeigt werden oder auch eigene Funktionen geschrieben werden, die dies von außen ermöglichen.
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 03:05
von Regenduft
STARGÅTE hat geschrieben:Ja klar, InitKeyboard() funktioniert ja nur bei geöffnetem Screen
War mit gar nicht bewusst...
Andere von DirectX anhängige Funktionen funktionieren aber trotzdem! Da hatte ich mich wohl getäuscht... kann man wohl problemlos anderweitig auslagern! Hier mal InitSound() als Beispiel:
Code: Alles auswählen
Import "MyScreen.lib"
Open(WindowID.i, Width.i, Height.i)
Show()
Close()
EndImport
Enumeration
#Window
EndEnumeration
; DX-Sound, keine Probleme!
InitSound()
If LoadSound(0, OpenFileRequester("Wave laden...", "", "Wave-Dateien|*.wav", 1))
PlaySound(0)
EndIf
OpenWindow(#Window, 0, 0, 800, 600, "ScreenTitle", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Open(WindowID(#Window), WindowWidth(#Window), WindowHeight(#Window))
Repeat
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
Close()
End
Case #PB_Event_None
Break
EndSelect
ForEver
Show()
ForEver
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 12:26
von Bisonte
kurze Frage, ohne vom Thema abzuschweifen :
Wenn man eine DLL mit PB erstellt, wo bekommt man denn die *.LIB Datei her, bzw wo wird diese gespeichert ?
Ich sehe immer nur die *.dll ....
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 12:55
von STARGÅTE
Wenn du eine DLL erzeugst, wird (zumindest bei mir) automatisch eine .LIB und eine .EXP
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 16:10
von Bisonte
STARGÅTE hat geschrieben:Wenn du eine DLL erzeugst, wird (zumindest bei mir) automatisch eine .LIB und eine .EXP
die Frage war ja : WO werden die gespeichert. Also bei mir zumindest nicht im gleichen Verzeichnis wie die dll... oder der Source.
Re: (Lesefehler an der Adresse xxxxxxxx)
Verfasst: 15.10.2013 16:34
von Regenduft
Bisonte hat geschrieben:die Frage war ja : WO werden die gespeichert. Also bei mir zumindest nicht im gleichen Verzeichnis wie die dll... oder der Source.
Also bei mir werden sie genau dort gespeichert (also im Verzeichnis der DLL). Vielleicht mal in %TEMP% suchen? Wenn nicht vielleicht im "Virtual Store"? Auf jeden Fall ist es "nicht normal", wenn sich .LIB und .EXP irgendwo anders befinden... Waren schon immer bei der DLL... Keine Ahnung, warum es bei Dir anders sein könnte... Hilft wohl nur die Win-SuFu und ein biss'l Geduld...