Seite 1 von 2
d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 10:13
von JReimi
Habe folgenden Codeschnipsel, der auf meinen 32Bitsystem mit PB 4.X gelaufen ist, und nun under 64Bit und PB 5.x nicht mehr läuft. Woran kann das liegen?
Rückgabewert von D3DInst ist bestimmt 10 Stellen lang.
Meldung bei CallFunctionFast Write error at Adress 0
Code: Alles auswählen
Procedure D3D_Init()
Global D3DInst
Global D3D.IDirect3D9
Global D3DWnd.D3DPresent_Parameters
Global D3DDevice.IDirect3DDevice9
Global D3DInst
D3DInst=LoadLibrary_("D3D9.dll")
If D3DInst
D3D=CallFunctionFast(GetProcAddress_(D3DInst,"Direct3DCreate9"),#D3D_SDK_VERSION)
EndIf
ProcedureReturn D3D
EndProcedure
__________________________________________________
Code-Tags hinzugefügt
01.11.2017
RSBasic
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 12:00
von Mijikai
GetProcAddress_() wird von PB in x64 nicht korrekt aufgerufen...
Besser die Importfunktion von PB nutzen.
Code: Alles auswählen
Import "d3d9.lib"
Direct3DCreate9(SDKVersion.l)
EndImport
Zudem ändern sich die d3d Strukturen in x64!
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 12:32
von JReimi
Danke für die Antwort. Habe mir gerade die 32 Bit Version runtergeladen, aber da kam die Meldung Read error at Adress 0
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 12:43
von Mijikai
JReimi hat geschrieben:Danke für die Antwort. Habe mir gerade die 32 Bit Version runtergeladen, aber da kam die Meldung Read error at Adress 0
Wo?
Bsp.:
Code: Alles auswählen
Import "d3d9.lib"
Direct3DCreate9(SDKVersion.l)
EndImport
#D3D_SDK_VERSION = 31
*Device.IDirect3DDevice9 = Direct3DCreate9(#D3D_SDK_VERSION)
Debug *Device
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 12:48
von JReimi
zeile callfunctionfast
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 12:51
von Mijikai
JReimi hat geschrieben:zeile callfunctionfast
Sieht so aus als ob PB GetProcAddress_() immer falsch aufruft...
-> Fix:
Code: Alles auswählen
Import "kernel32.lib"
GetProcAddress(ModuleHandle.i,FunctionName.p-Ascii)
EndImport
Es gibt keinen guten Grund CallFunctionFast() zu nutzen wenn die APIs
einfach importiert werden können.
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 13:01
von RSBasic
Mijikai hat geschrieben:Sieht so aus als ob PB GetProcAddress_() immer falsch aufruft...
Hm, wenn das stimmt, frage ich mich, ob das bereits im englischen Forum bekannt ist?
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 13:02
von ts-soft
Du solltest nicht mehr mit den API-Funktionen zur Nutzung einer DLL arbeiten, da hat PB bessere Funktionen, die dann auch
sicherer sind.
GetProcAddress_(...) benötigt die Funktion in Literalen als ASCII, wobei PB es aber als UNICODE übergibt. Das Programm erkennt also die Funktion nicht und gibt dann selbstverständlich "Fehler" bzw. 0 zurück.
Dein Code sollte also so aussehen:
Code: Alles auswählen
Procedure D3D_Init()
Global D3DInst
Global D3D.IDirect3D9
Global D3DWnd.D3DPresent_Parameters
Global D3DDevice.IDirect3DDevice9
Global D3DInst
D3DInst = LoadLibrary_("D3D9.dll")
If D3DInst
Protected *func = Ascii("Direct3DCreate9")
D3D = CallFunctionFast(GetProcAddress_(D3DInst, *func), #D3D_SDK_VERSION)
FreeMemory(*func)
EndIf
ProcedureReturn D3D
EndProcedure
ungetested!
Besser wäre es mit Prototypes und GetFunction zu arbeiten, oder mit Import, wobei man dann auf das evtl. Fehlen
der DLL nicht reagieren kann.
Getestete Version würde ich Dir ja gerne geben, aber ohne definition der Structure D3DPresent_Parameters und der
konstanten #D3D_SDK_VERSION in Deinem Beispielsource ist mir das zu Aufwendig
Gruß
Thomas
Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 13:09
von Mijikai
RSBasic hat geschrieben:Mijikai hat geschrieben:...ob das bereits im englischen Forum bekannt ist?
Das PB-Team sollte erstmal die 2D Libraries fixen und uns Zugriff/Strukturen zu Libraries geben
die PB sowieso verwendet...
Games with PB...

Re: d3d9.dll falscher Rückgabewert bei x64 System
Verfasst: 01.11.2017 13:44
von RSBasic
Mijikai hat geschrieben:Das PB-Team sollte erstmal die 2D Libraries fixen
Ich habe das nicht so verfolgt, was für Fehler gibt es denn derzeit? Das wäre für mich interessant zu wissen, da ich demnächst auch ein Spiel entwickeln möchte.
Mijikai hat geschrieben:Das PB-Team sollte erstmal die 2D Libraries fixen
Die allgemeine Linux-Unterstützung sollte auch verbessert werden, da soweit ich weiß dort mehr Fehler existieren.
ts-soft hat geschrieben:Du solltest nicht mehr mit den API-Funktionen zur Nutzung einer DLL arbeiten, da hat PB bessere Funktionen
Die PB-Funktionen greifen ja auch nur auf API-Funktionen des jeweiligen Betriebssystems zu.