(Lesefehler an der Adresse xxxxxxxx)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
String
Beiträge: 69
Registriert: 17.05.2007 16:22

(Lesefehler an der Adresse xxxxxxxx)

Beitrag 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)
PB v4.**
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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")
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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.)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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.)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag von Regenduft »

STARGÅTE hat geschrieben:Ja klar, InitKeyboard() funktioniert ja nur bei geöffnetem Screen
War mit gar nicht bewusst... :oops:

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
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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 ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag von STARGÅTE »

Wenn du eine DLL erzeugst, wird (zumindest bei mir) automatisch eine .LIB und eine .EXP
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: (Lesefehler an der Adresse xxxxxxxx)

Beitrag 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...
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten