Problem mit WinAPI wahrscheinlich wegen Unicode
-
ich drück nun schon 10 minuten F5 und du hast immer noch nicht geantwortet
-
Sry xD
Also, d3dx9.lib auch gelinkt, auf Multi-Byte umgestellt und es funktioniert leider immer noch nicht
Ich meine, es ist ja ein "Direct3D" Programm, also hab ich das neuste DX SDK gelinkt, etc. aber es will einfach nicht
-
-
CaptainObvious schrieb:
http://www.imagenetz.de/download,file=2c1df8004a1d00af154657733
Du hast zuviel Zeit, stimmts?
Und wer ist Martin Richter?Da ich aber nicht ausschließen will, dass ich an einer anderen Stelle des Quellcodes einen Fehler gemacht habe, poste ich einfach mal den gesammte Code (entnommen aus einem Tutorial):
-
Hi,
einfach Unicode beibehalten#include <tchar.h> ... /*statt const char szAppName[] = "Direct3D";*/ const TCHAR szAppName[] = TEXT("Direct3D");
Sollte funktionieren
Gruß Pingu
-
Pingu-Group schrieb:
Hi,
einfach Unicode beibehalten#include <tchar.h> ... /*statt const char szAppName[] = "Direct3D";*/ const TCHAR szAppName[] = TEXT("Direct3D");
Sollte funktionieren
Gruß Pingu
Ok, vielen Dank erstmal!
Wenn ich das jetzt compiliere kommt die Fehlermeldung:
1>p:\projekte directx\direct3d basic\direct3d basic\main.cpp(54) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char [26]' in 'LPCWSTR' nicht möglich
Wie ich weis, ist LPCWSTR ein Datentyp für einen Unicodestring. Der dritte Parameter in CreateWindowEx ist WINDOW_TITLE, definiert als
#define WINDOW_TITLE "My first Direct3D program"
Wenn ich jetzt wie in deinem Lösungsvorschlag das gleiche mit dem WINDOW_TITLE mache, also
const TCHAR WINDOW_TITLE[] = TEXT("My first Direct3D program");
kommt wieder der Linker fehler (ich poste ihn am Ende nochmal!).
Wenn mir das ganze dann stinkt und ich einfach als dritten Parameter L"My first Direct3D program" schreibe, kommt (wer hätte es gedacht) der Linker fehler.
Ich gehe in diesem Fall mal nicht vom Versagen der Software, sonder vom meinem eigenen aus, aber möchte trotzdem nochmal betonen dass ich mittels #pragma comment sowohl d3d9.lib als auch d3dx9.lib gelinkt habe!Der Linkerfehler ->
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""void __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAXPAUHWND__@@@Z)". 1>P:\Projekte DirectX\Direct3D Basic\Debug\Direct3D Basic.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 1>Das Buildprotokoll wurde unter "file://p:\Projekte DirectX\Direct3D Basic\Direct3D Basic\Debug\BuildLog.htm" gespeichert. 1>Direct3D Basic - 2 Fehler, 0 Warnung(en)
-
beginner88 schrieb:
const TCHAR WINDOW_TITLE[] = TEXT("My first Direct3D program");
Semikolon weg. Du musst auch unterscheiden zwischen Linker- und Compiler-Fehlern.
-
Badestrand schrieb:
beginner88 schrieb:
const TCHAR WINDOW_TITLE[] = TEXT("My first Direct3D program");
Semikolon weg.
Sicher dass du dich da nicht verlesen hast? Weil das kann ja nicht sein^^
Badestrand schrieb:
Du musst auch unterscheiden zwischen Linker- und Compiler-Fehlern.
Nja, ich dachte wenn der Compiler mir ne Fehlermeldung ausgibt, nach der ich falsch gelinkt habe, dann ist das ein Linkerfehler, oder? Bitte aufklären
EDIT: Bevor ich mich schlafen lege:
Ich denke mal es kann doch gut sein, dass ich mist mit dem SDK gemacht habe, oder? Also unter Bibliotheksdatein hab ich für das SDK folgendes eingegeben "P:\Microsoft DirectX SDK (August 2008)\Lib\x64", da ich eine 64bit Version von Vista besitze. Stimmt das, oder hab ich da was falsch gemacht?
-
Ohje ohje, sorry, vergiss meinen Post, ist schon spät
-
beginner88 schrieb:
Ich hab mich etwas schlau gemacht und in Erfahrung gebracht, dass das Problem wahrscheinlich mit Unicode zu tun hat.
Jetzt dachte ich aber, wenn ich z.B. einen Unciodefehler bei einer MessageBox bekomme (sprich bei Strings) setze ich ein L vor den String (L"Text").
Aber das scheint ja hier nicht zuzutreffen.Das trifft schon zu.
Wenn du mit Unicode kompilierst, wird TCHAR durch wchar_t ersetzt und TEXT() durch L vor dem String. Ohne Unicode wird aus TCHAR ein normaler char.1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""void __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAXPAUHWND__@@@Z)". 1>P:\Projekte DirectX\Direct3D Basic\Debug\Direct3D Basic.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 1>Das Buildprotokoll wurde unter "file://p:\Projekte DirectX\Direct3D Basic\Direct3D Basic\Debug\BuildLog.htm" gespeichert. 1>Direct3D Basic - 2 Fehler, 0 Warnung(en)
Das ist auf jeden Fall ein Linker Error. Solche Fehler erhalte ich immer, wenn ich vergesse eine library einzubinden. Ich weiß du hast sie eingebunden, aber scheinbar ist dabei doch etwas schief gelaufen.
-
mit unicode hat das ganze wenig zu tun, es handelt sich um einen linkerfehler.
wenn du einen linkerfehler hast, ist aber schon alles richtig kompiliert, d.h.
das unicode problem ist weg.guck mal in dem ordner nach, den du eingetragen hast. vllt ist die .lib gar
nicht drin.versuch auch mal den x86 ordner einzutragen, das klappt auch auf 64-bit.
wenns nix hilft kannst du versuchen das teil dynamisch zu laden, also ohne
die .libdas setzt die d3d9.dll vorraus die entweder im system32 ordner oder
im anwendungsordner liegen muss (muss auch bei der statischen variante, wenn
das auch schief geht ist mit dem sdk was falsch)ganz oben bei den globalen variablen
HMODULE d3ddll; typedef IDirect3D9 (*CreateFunc)(UINT);
dann in der anwendung (vor dem erstellen von der schnittstelle)
d3ddll = LoadLibrary("d3d9.dll"); if (!d3ddll) { MessageBox(0, L"d3d9.dll nicht gefunden", 0, 0); // mit oder ohne unicode return 0; } CreateFunc CreateDirect3D = (CreateFunc)GetProcAddress(d3ddll, "Direct3DCreate9"); if (!CreateDirect3D) { MessageBox(0, L"d3d9.dll beschädigt", 0, 0); // diese stelle soltest du *nie* erreichen return 0; }
dann einfach aufrufen
d3d = CreateDirect3D(D3D_SDK_VERSION);
m ende der anwedung ein
FreeLibaray(d3ddll);
-
da es noch nicht gesagt wurde, es handelt sich hier um einen linkerfehler.
-
helferleins tipp ist ein schmieriger hack, sowas sollte für dich keine lösung darstellen, hast du schon mal über google geschaut ob menschen ähnliche probleme haben wie du?
-
helferlein schrieb:
versuch auch mal den x86 ordner einzutragen, das klappt auch auf 64-bit.
Tatsächlich
Also damit hab ich wirklich nicht gerechnet, aber super dass es jetzt funktioniert!Vielen Danke an alle für ihre zahlreichen Post, haben mir wirklich geholfen!