d3d9.dll falscher Rückgabewert bei x64 System

Probleme beim Erstellen von 3D-Modellen und Texturen, keine Ahnung womit man Musik macht? Dies ist dein Forum.
JReimi
Beiträge: 4
Registriert: 20.04.2014 19:11

d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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!
JReimi
Beiträge: 4
Registriert: 20.04.2014 19:11

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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
Zuletzt geändert von Mijikai am 01.11.2017 12:49, insgesamt 1-mal geändert.
JReimi
Beiträge: 4
Registriert: 20.04.2014 19:11

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag von JReimi »

zeile callfunctionfast
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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... :angry:

Games with PB... :freak:
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: d3d9.dll falscher Rückgabewert bei x64 System

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten