DirectX - Funktionen aus der API / SDK und wie weiter?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

DirectX - Funktionen aus der API / SDK und wie weiter?

Beitrag von Falko »

Hi @All
Ich habe mir mal die directX9SDK heruntergeladen.
Wie muß man jetzt diese Funktionen in PB einsetzen?
Versuche mit irgendwelchen Init.. für PB gehen leider nicht. Ich hab hier mal einen angefangenen Source, aber was
muß ich da noch einfügen damit dieses Codeschnipsel läuft?

Code: Alles auswählen

;.......?????????????????
If DirectXSetupGetVersion_(*Version,*Revision)>0
  Debug Version
  Debug Revision
EndIf
;.......
MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Das komische, ich bekomme vom Debugger eine Fehlermeldung, das die
dsetup.dll nicht installiert sei und ich diese neu installieren soll. Vorhanden ist diese mehrfach. Wenn PB die Erkennt, dann müßte die
directx-Funktion doch laufen, oder irre ich mich da? (Getestet mit der neuen PB-Beta 3.92. die jetzt diese Fehlermeldung rausbringt).
Kann mir denn keiner da einen Tip geben? :?

Das C-Beispiel aus der SDK sieht so aus:

Code: Alles auswählen

DWORD dwVersion;
DWORD dwRevision;
if (DirectXSetupGetVersion(&dwVersion, &dwRevision))
{
    printf("DirectX version is %d.%d.%d.%d\n",
           HIWORD(dwVersion), LOWORD(dwVersion),
           HIWORD(dwRevision), LOWORD(dwRevision));
}
Und das steht in der DirectXSDK.
DirectXSetupGetVersion Function

--------------------------------------------------------------------------------

Retrieves the version number of the Microsoft® DirectX® components that are currently installed.

Syntax

INT DirectXSetupGetVersion( DWORD *pdwVersion,
DWORD *pdwRevision
);
Parameters

pdwVersion
Pointer to the address of a variable to receive the version number. This parameter can be NULL if the version number is not wanted.
pdwRevision
Pointer to the address of a variable to receive the revision number. This parameter can be NULL if the revision number is not wanted.
Return Value

If the function succeeds, it returns nonzero.

If it fails, it returns 0.




Remarks

The DirectXSetupGetVersion function can be used to retrieve the version and revision numbers before or after the DirectXSetup function is called. If it is called before DirectXSetup is invoked, it gives the version and revision numbers of the DirectX components that are currently installed. If it is called after DirectXSetup is called, but before the computer is restarted, it gives the version and revision numbers of the DirectX components that take effect after the computer is restarted.

The version number in the pdwVersion parameter is composed of the major version number and the minor version number. The major version number is in the 16 most significant bits of the DWORD when this function returns. The minor version number is in the 16 least significant bits of the DWORD when this function returns. The version numbers can be interpreted as follows:

DirectX version Value pointed to by pdwVersion
DirectX 5.0 0x00040005
DirectX 6.0 0x00040006
DirectX 7.0 0x00040007
DirectX 8.x 0x00040008
DirectX 9.0 0x00040009


DirectX 9.0 supports only operating systems and DirectX versions later than Microsoft Windows® 98 and DirectX 5.0. This method will not return a value less than 0x00040005 for pdwVersion.

The version number in the pdwRevision parameter is composed of the release number and the build number. The release number is in the 16 most significant bits of the DWORD when this function returns. The build number is in the 16 least significant bits of the DWORD when this function returns.

All DirectX 8.x releases have the same pdwVersion value. The pdwRevision parameter differentiates them. DirectX 8.x versions do not install on Windows XP. Windows XP shipped with DirectX 8.1 and the DirectX 8.1a and DirectX 8.1b updates were included in Windows XP Service Pack 1. The following table lists the pdwRevision values for DirectX 8.x. DirectX release pdwRevision Notes
DirectX 8.0
DirectX 8.1 0x0001032A 4.08.01.0810. Windows XP version
DirectX 8.1 0x00010371 4.08.01.0881. This is the DirectX 8.1 version for the down level operating systems. 0371 is the hex version for 0881 decimal revision value
DirectX 8.1a 0x00010385 4.08.01.0901. This release includes an update to Microsoft Direct3D® (d3d8.dll).
DirectX 8.1b 0x00010385 4.08.01.0901. This update includes a fix to Microsoft DirectShow® on Windows 2000 (quartz.dll)
DirectX 8.2 0x00020386 4.08.02.0134. This version includes Microsoft DirectPlay® updates for both Windows XP and downlevel operating systems.


Note There is no way to tell the difference between DirectX 8.1a and DirectX 8.1b with the pdwVersion and pdwRevision values. DirectX 8.1a updates only D3d8.dll. DirectX 8.1b includes the changes in DirectX 8.1a as well as updates to other files. Use GetFileVersionInfo to get version information for the following files.
On Windows 2000:

Quartz.dll 6.03.01.0885
Stream.sys 5.01.2600.0885
Mpg2splt.ax 6.03.01.0885
D3d8.dll 5.01.2600.0901
D3d8d.dll 5.01.2600.0901

On Windows 95 or later:

Mpg2splt.ax 6.03.01.0885
D3d8.dll 4.08.01.0901
D3d8d.dll 4.08.01.0901

The following sample code fragment demonstrates how the information returned by DirectXSetupGetVersion can be extracted and used.

DWORD dwVersion;
DWORD dwRevision;
if (DirectXSetupGetVersion(&dwVersion, &dwRevision))
{
printf("DirectX version is %d.%d.%d.%d\n",
HIWORD(dwVersion), LOWORD(dwVersion),
HIWORD(dwRevision), LOWORD(dwRevision));
}

Version and revision numbers can be concatenated into a 64-bit quantity for comparison. The version number is in the 32 most significant bits and the revision number is in the 32 least significant bits.

Function Information

Header dsetup.h
Import library dsetup.lib
Minimum operating systems Windows 98

Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

ich krieg es auch einfach nicht gebacken...

mit pb 3.91 bekam ich ebenfalls immer einen peles c polink linking fehler. mit der neuen 3.92b1, scheint dieses problem behoben, denoch will das ganze nicht so richtig funktionieren.

obwohl ich directx 9.0c installiert habe, habe ich nirgendwo eine dsetup.dll oder dsetup32.dll rumliegen und bekomme eine fehlermeldung "dsetup.dll konnte nicht gefunden werden..." wenn ich jedoch die dsetup.dll und dsetup32.dll (von einer spiele cd) ins system32 verzeichniss rüberkopiere, krieg ich trotzdem wieder eine fehlermeldung "die anwendung konnte nicht richtig initialisiert werden..."

ist es nun ein fehler von mir, oder von pb?! hoffentlich weiss jemand rat. :(

c ya,
nco2k
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Die dsetup.dll habe ich einmal unter Windows XP bzw. wird auch mit der
SDK für Direktx9 mitgeliefert. Trotzdem kriege ich ebenfalls diese Fehlermeldung. Vielleicht hat das ja auch damit zu tun, das es kein
passendes Init-Modul dazu in PB gibt und diese evt. (k.A) durch Interfaces declariert werden muß. Aber warum erkennt der Debugger, Polink denn diesen Befehl und gibt auch noch aus, das diese desetup.dll noch installiert werden müsse, obwohl die bei mir schon ca. 8-Fach vorhanden ist? Kann man das komplette DirectX (bis Version 9) etwa doch nicht in PB nutzen? Hilfe Danilo, Freak,Rings und Fred.

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

@Falko:
Die DSETUP.dll ist bei den DX-SDKs immer dabei, in SDK\redist\
und man kann sie weitergeben.

Wenn Du die DLL schon hast, dann ist sie vielleicht nicht im
Path, also findet er die DLL nicht.

Habs grad kurz probiert und die DSETUP.dll von den DX-SDKs 7 und 9
in PureBasic\Compilers\ kopiert - und hat funktioniert.

Code:

Code: Alles auswählen

;
; by Danilo, 12.10.2004 - german forum
;
; requires DSETUP.dll from DirectSDK\redist\
;
Procedure DirectXSetupGetVersion(*version,*revision)
  lib = OpenLibrary(1,"DSETUP.dll")
  If lib
    ret = CallFunction(1,"DirectXSetupGetVersion",*version,*revision)
    CloseLibrary(1)
  EndIf
  ProcedureReturn ret
EndProcedure


If DirectXSetupGetVersion(@Version,@Revision)>0
  Debug "DirectX Version: "+Str(Version>>16&$FFFF)+"."+Str(Version&$FFFF)+"."+Str(Revision>>16&$FFFF)+"."+Str(Revision&$FFFF)
  Debug "  (DirectX "+Str(Version&$FFFF)+")"
EndIf
Oder hier inkl. DSETUP.dll vom DX7 SDK: DSETUP.zip (15k)

Wenn die DLL nicht im Path ist, dann muß sie im .EXE Verzeichniss
sein - oder man nimmt den kompletten Pfad zur DLL.
Bei F5-Kompilierung muß die DLL in PureBasic\Compilers\ sein.


PS: Dein "If DirectXSetupGetVersion_(*Version,*Revision)>0"
wär sowieso nicht richtig, da das 2 Null-Pointer sind.
Du mußt die Adresse dieser 2 Long-Variablen übergeben, als mit '@' !
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Danke Danilo,
habe es mal kurz getestet. Muß gleich arbeiten und melde mich heut abend zurück.

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@Danilo,
habe jetzt, wie du beschrieben hast, direkt aus der SDK beide DLL's ins Compilerverzeichnis kopiert und das funktioniert jetzt, wie du's hier gepostet hast. Nochmals vielen, vielen Dank.

Das mit den Pointern '*' hatte ich schon probiert. Aber das mit dem kopieren ins Compilerverzeichnis war bei mir wohl hauptsächlich der Fehler.

Auf jeden Fall habe ich durch deinen Tip, der auch gut fürs CodeArchiv wäre, schon mal einen DirectX-anfang. :allright:

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Falko hat geschrieben:Auf jeden Fall habe ich durch deinen Tip, der auch gut fürs CodeArchiv wäre, schon mal einen DirectX-anfang. :allright:
Aber selbstversändlich doch...... Code-Beispiele (c) Danilo => 99,9% Aufnahme ins CodeArchiv :mrgreen:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Andre hat geschrieben:
Falko hat geschrieben:Auf jeden Fall habe ich durch deinen Tip, der auch gut fürs CodeArchiv wäre, schon mal einen DirectX-anfang. :allright:
Aber selbstversändlich doch...... Code-Beispiele (c) Danilo => 99,9% Aufnahme ins CodeArchiv :mrgreen:
Das ist doch nur 1 Funktionsaufruf, mehr nicht. Wenn es in
der Beta gefixt wurde, dann kannst Du es auch direkt verwenden:

Code: Alles auswählen

If DirectXSetupGetVersion_(@Version,@Revision)
  Debug "DirectX Version: "+Str(Version>>16&$FFFF)+"."+Str(Version&$FFFF)+"."+Str(Revision>>16&$FFFF)+"."+Str(Revision&$FFFF)
  Debug "  (DirectX "+Str(Version&$FFFF)+")"
EndIf
Das ist doch eigentlich nicht schwer, oder? Steht auch im DX-SDK.

Das Problem hier war doch nur das die DLL nicht im Path oder
EXE-Verzeichniss war, und das hat eig. nichts mit der Funktion
hier zu tun, sondern allgemein mit der DLL-Benutzung/-Programmierung.

Könnte man ja in die Hilfe schreiben unter DLL, falls noch nicht
geschehen. Also ein Anleitung von A bis Z wie man DLLs als
Programmierer benutzt/anspricht, was es für Arten von DLLs
gibt und so weiter. Dann versteht es auch Falko und meine
Oma, falls die mal programmieren lernt... ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@Danilo
Ich muß echt zugeben, das es halt nicht einfach ist, im Vergleich zu GFA-Basic, wo DLL's declariert werden und dann direkt als Befehl aufgerufen werden könnem, erst in Purbasic das ganze über Proceduren umleiten muß. Daher ist es aber gut zu wissen, wenn man sowas wie hier hat, auch wo anders wie z.B. in PureArea.net als kleines Beispiel finden kann, auch wenn es in der 2. Beta gefixt wird nachdem man hier dumm und dähmlich nachfragen muß und evt. mit einer Oma gleichgestellt wird. :mrgreen:

Hier mal soein Beispiel von GFA-Basic-DLL - Hilfe.
Der Befehl DLL

Funktion: öffnet eine DLL (dynamic link library).
Syntax: DLL #n,name$ n: iexp, Wertebereich 0-31 name$: sexp

Erläuterung: Die DLL mit dem Namen name$ wird geöffnet. name$ darf einen Pfad enthalten. Anschließend wird das Handle dieser DLL für die DECL Befehle
benutzt. Mittels ENDDLL werden die Deklarationen abgeschlossen.

FREEDLL #n gibt die DLL wieder frei. Die dazugehörigen DECL Befehle verlieren danach ihre Gültigkeit.

Bitte beachten Sie: im kompilierten Programm ist eine Pfadangabe unzulässig! Dort darf nur der Name der DLL verwendet werden. Die DLL muß
anschließend in einem der folgenden Verzeichnisse zu finden sein:

· in einem der im Pfad befindlichen Verzeichnisse
· im Windows-Verzeichnis
· im Windows-System-Verzeichnis
· oder im aktuellen Verzeichnis.

Sollten Sie mit Pfadangabe kompilieren, erzeugt der Linker eine Syntax-Error-Fehlermeldung für die IMPORTS-Sektion in der .DEF-Datei.

Beispiel: OPENW #1

DLL #1,"kernel"
DECL WORD GlobalAlloc(l,w) C GET
ENDDLL
a = ^GolbalAlloc(1000,GHND)
FREEDLL 1
PRINT a
PRINT GlobalSize(a)
IF a THEN PRINT GlobalFree(a)
PAUSE 20
CLOSEW #1


oder

OPENW #1
DLL #1,"kernel"
DECL WORD GlobalAlloc(w,l) PASCAL GET
ENDDLL
a = @@GolbalAlloc(GHND,1000)
FREEDLL 1
PRINT a,
PRINT GlobalSize(a)
IF a THEN PRINT GlobalFree(a)
PAUSE 20
CLOSEW #1


Verwandte

Befehle: ENDDLL, FREEDLL, DECL
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten