Beispiel für DirectX9.C Problem
-
Hallo ihr lieben, ich versuche mich gerade an Programmierung mit DirectX und habe aus dem Buch von David Scherfgen mir folgendes Beispiel abgeschrieben um es zu testen.
#include <Windows.h> #include <StdIO.h> #include <D3D9.h> int g_iNumAdapters; D3DADAPTER_IDENTIFIER9* g_pAdapters; PDIRECT3D9 g_pD3D = NULL; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCmdLine, int iShowCmd) { char acAdapterInfo[1024]; g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D ==NULL) { MessageBox(NULL, "Fehler beim Erzeugen von Direct3D Schnittstelle", "Fehler", MB_OK | MB_ICONEXCLAMATION); return 1; } g_iNumAdapters = g_pD3D->GetAdapterCount(); g_pAdapters = new D3DADAPTER_IDENTIFIER9[g_iNumAdapters]; for(int iAdapter = 0; iAdapter < g_iNumAdapters; iAdapter++) { if(FAILED(g_pD3D->GetAdapterIdentifier(iAdapter, 0, &g_pAdapters[iAdapter]))) { MessageBox(NULL, "Adapter Information konnte nicht abgefragt werden!", "Fehler", MB_OK | MB_ICONEXCLAMATION); g_pD3D->Release(); delete[] g_pAdapters; return 1; } sprintf(acAdapterInfo, "Adapter-ID: %d\n Name: %s\n Treiber: %s\ nTreiberversion: %d", iAdapter, g_pAdapters[iAdapter].Description, g_pAdapters[iAdapter].Driver, g_pAdapters[iAdapter].AdriverVersion); MessageBox(NULL, acAdapterInfo, "Adapter gefunden", MB_OK | MB_ICONINFORMATION); } g_pD3D->Release(); delete[] g_pAdapters; return 0; }Bekomme aber diese FM:
error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [48]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [51]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
warning C4129: ' ': Nicht erkannte Folge von Escapesequenz
error C2039: 'AdriverVersion': Ist kein Element von '_D3DADAPTER_IDENTIFIER9'
c:\programme\microsoft directx sdk (april 2006)\include\d3d9types.h(1691): Siehe Deklaration von '_D3DADAPTER_IDENTIFIER9'
error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'char [1024]' in 'LPCWSTR' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Ich habe es genau abgeschrieben aber es geht nicht weiß jemand rat?
Ich benutze die Microsoft Visual C++ 2005 Express Edition und habe DirectX9 SDK installiert.Sorry für den doppelpost in C++ Forum ggf dann diesen ein Moderator löschen.
Gruß JDJ
-
Du versuchst ASCII in Unicode Zeichen zu casten. Das geht nicht! f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
-
TGGC schrieb:
Du versuchst ASCII in Unicode Zeichen zu casten. Das geht nicht! f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
Hallo TGCC,
danke für deinen Post leider habe ich mit dem Thema gerade erst angefangen. Laut Buch sollte der Code so gehen wie ich Ihn hier gepostet habe, daher weiß ich leider (noch) nicht was ich ändern muss. Im Buch wird der Code erklärt aber ich weiß nicht wo ich ansetzen muss damit es geht. Es würde mich ehr freuen wenn du mir die Zeilen nummer sagen könnstet welche ich überarbeiten muss. Da ich mit
'const char [48]' in 'LPCWSTR' nicht möglich
(noch) nicht viel anfangen kann.Gruß JDJ
-
Die Zeilennummer sagt dir der Compiler in der Fehlermeldung. f'`8k
BTW: Was hat der Fehler mit DX zu tun?
AutocogitoGruß, TGGC (\-/ has leading)
-
TGGC schrieb:
Die Zeilennummer sagt dir der Compiler in der Fehlermeldung. f'`8k
Autocogito
BTW: Was hat der Fehler mit DX zu tun?
Gruß, TGGC (\-/ has leading)
Soweit wie ich verstanden habe muss ich
const char konvertieren in LPCWSTR und das geht mit MultiByteToWideChar. Aber wie wende ich das an? Damit habe ich noch nicht gearbeitet und aus der MS hilfe zu MultiByteToWideChar werd ich da nicht schlau.Gruß JDJ
-
Ja, das könntest du so konvertieren. Aber warum legst du deine Stringliterale dann nicht gleich als Unicode an? f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
-
TGGC schrieb:
Ja, das könntest du so konvertieren. Aber warum legst du deine Stringliterale dann nicht gleich als Unicode an? f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
Wie Konvertiere ich das bei einer MessageBox? Laut Hilfe von MS ist der MessageBox Inhalt: LPCTSTR.
-
-
Hallo
Welche IDE verwendest du? Visual Studio? -> dann schalte mal bei den Projektoptionen unter Character Set Multibyte ein.
chrische
P.S.: Laß dich nicht verunsichern.
-
chrische5 schrieb:
Hallo
Welche IDE verwendest du? Visual Studio? -> dann schalte mal bei den Projektoptionen unter Character Set Multibyte ein.
chrische
P.S.: Laß dich nicht verunsichern.
Ich benutze Microsoft Visual C++ 2005 Express Edition.
Ok ich schalte es ein und dann probiere ich es nochmal.
-
chrische5 schrieb:
Welche IDE verwendest du? Visual Studio?
Wer lesen kann, ist klar im Vorteil.

Gruß, TGGC (\-/ has leading)
-
Hallo
TGGC schrieb:
chrische5 schrieb:
Welche IDE verwendest du? Visual Studio?
Wer lesen kann, ist klar im Vorteil.

Gruß, TGGC (\-/ has leading)
Da kann ich dir in diesem Fall nur recht geben.
chrische
-
chrische5 schrieb:
Hallo
Welche IDE verwendest du? Visual Studio? -> dann schalte mal bei den Projektoptionen unter Character Set Multibyte ein.
chrische
P.S.: Laß dich nicht verunsichern.
Hi Chrische5,
ich habe bei mir sämtliche Optionen durchsucht aber so einen Punkt den du beschreibst finde ich nicht. Wo genau soll dieser sein?Gruß JDJ
-
alt+f7, Configuration_Properties->General->Project_Defaults: Character Set
-
hellihjb schrieb:
alt+f7, Configuration_Properties->General->Project_Defaults: Character Set
Ich habe es jetzt umgestellt bekomme jetzt aber die FM:
Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__MessageBoxA@16" in Funktion "_WinMain@16".
Test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion "_WinMain@16".
MSVCRTD.lib(crtexe.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".Der Code sieht jetzt so aus:
#include <Windows.h> #include <StdIO.h> #include <D3D9.h> int g_iNumAdapters; //Anzahl der Adapter D3DADAPTER_IDENTIFIER9* g_pAdapters; //Adapterliste PDIRECT3D9 g_pD3D = NULL; //IDirect3D9-Schnitstelle int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCmdLine, int iShowCmd) { char acAdapterInfo[1024]; //Schnittstelle für Direct3D erzeugen g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D ==NULL) { //Fehler MessageBox(NULL, "Fehler beim Erzeugen von Direct3D Schnittstelle", "Fehler", MB_OK | MB_ICONEXCLAMATION); return 1; } //Adapter Anzahl ermitteln g_iNumAdapters = g_pD3D->GetAdapterCount(); //Speicher reservieren und Informationen über jeden Adapter sammeln g_pAdapters = new D3DADAPTER_IDENTIFIER9[g_iNumAdapters]; for(int iAdapter = 0; iAdapter < g_iNumAdapters; iAdapter++) { if(FAILED(g_pD3D->GetAdapterIdentifier(iAdapter, 0, &g_pAdapters[iAdapter]))) { //Fehler MessageBox(NULL, "Adapter Information konnte nicht abgefragt werden!", "Fehler", MB_OK | MB_ICONEXCLAMATION); //Aufräumen g_pD3D->Release(); delete[] g_pAdapters; return 1; } //Adapterinformation anzeigen sprintf(acAdapterInfo, "Adapter-ID: %d\n Name: %s\n Treiber: %s nTreiberversion: %d", iAdapter, g_pAdapters[iAdapter].Description, g_pAdapters[iAdapter].Driver, g_pAdapters[iAdapter].DriverVersion); MessageBox(NULL, acAdapterInfo, "Adapter gefunden", MB_OK | MB_ICONINFORMATION); } //Aufräumen g_pD3D->Release(); delete[] g_pAdapters; return 0; }
-
Die externen Symbole MessageBox und Direct3DCreate9, welche du in der WinMain benutzt, können nicht aufgelöst werden. Weiterhin hast du keine main-Funktion definiert. f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
-
#pragma comment (lib, "d3d9.lib") #pragma comment (lib, "d3dx9.lib") #pragma comment (lib, "dinput.lib") #pragma comment (lib, "dinput8.lib") #pragma comment (lib, "dxguid.lib") #pragma comment (lib, "Winmm.lib")irgendwelche davon brauchst du
-
TGGC schrieb:
Die externen Symbole MessageBox und Direct3DCreate9, welche du in der WinMain benutzt, können nicht aufgelöst werden. Weiterhin hast du keine main-Funktion definiert. f'`8k
AutocogitoGruß, TGGC (\-/ has leading)
Ich finde es schwierig als Anfänger einen Fehler zu finden den es laut Buch nicht geben dürfte, daher würde ich mich sehr freuen wenn du mir den Code so Posten würdest wie er Funktionieren sollte. Da du das Rätzel ja anscheinend zu lösen vermagst.

-
-
Hallo
Versuch den Code mal zu ändern wie Xindon es geschrieben hat. TGGC gibt bestenfalls lustige Antworten oder er zeigt vor allem Leuten, die nicht so viel Ahnung haben wie er (und das sind bbei ihm gefühlte 100%) gerne, was er alles so auf dem Kasten hat.
chrische