Aktuelle Zeit: 28.02.2020 00:20

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 10:13 
Offline

Registriert: 20.04.2014 19:11
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 12:00 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
GetProcAddress_() wird von PB in x64 nicht korrekt aufgerufen...

Besser die Importfunktion von PB nutzen.
Code:
Import "d3d9.lib"
  Direct3DCreate9(SDKVersion.l)
EndImport


Zudem ändern sich die d3d Strukturen in x64!

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 12:32 
Offline

Registriert: 20.04.2014 19:11
Danke für die Antwort. Habe mir gerade die 32 Bit Version runtergeladen, aber da kam die Meldung Read error at Adress 0


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 12:43 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
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:
Import "d3d9.lib"
  Direct3DCreate9(SDKVersion.l)
EndImport

#D3D_SDK_VERSION = 31

*Device.IDirect3DDevice9 = Direct3DCreate9(#D3D_SDK_VERSION)

Debug *Device

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Zuletzt geändert von Mijikai am 01.11.2017 12:49, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 12:48 
Offline

Registriert: 20.04.2014 19:11
zeile callfunctionfast


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 12:51 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
JReimi hat geschrieben:
zeile callfunctionfast


Sieht so aus als ob PB GetProcAddress_() immer falsch aufruft...

-> Fix:

Code:
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.

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 13:01 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
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?

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 13:02 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
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:
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.71 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 19.3 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 13:09 
Offline
Benutzeravatar

Registriert: 25.09.2016 01:42
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:

_________________

Links:
PureBasic Discord
[ENGINE] 2D Engine Nautilus (Win)
[INCLUDE] GLFW 3.3 Library
[MODULE] Bass Library 2.4 (Win)
[LIBRARY] Hexi Binary2Hex (Win)



Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: d3d9.dll falscher Rückgabewert bei x64 System
BeitragVerfasst: 01.11.2017 13:44 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
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.

_________________
BildBildBildBild BildBild


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

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  

 


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