_D3DXCreateFontA@48 - Ein Linker Error wo keiner sein dürfte
-
Hallo Forum!
Ich habe vor einigerzeit mit D3D9 hooken angefangen und kriege wenn ich mit DirectX einen Schriftzug zeichnen will einen Linker error, obwohl ich anscheinend alles nötige gelinkt habe.. Wenn ich die Font funktionen aus dem script auskommentiere klappt es aber..Ich benutze die Microsoft Visual Express Edition IDE und den Visual C++ 2005/2008 Compiler. Ich besitze und habe die DirectX SDK vom November 2008 als sowohl auch die Platform SDK.
Ich Habe Vista Home Premium 64 Bit, teste die injection aber auf einem WinXp Professional 32 PC
hier die Compiler Meldung und header bzw. Main file:
1>------ Erstellen gestartet: Projekt: VC++ Hook, Konfiguration: Release Win32 ------ 1>Verknüpfen... 1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_D3DXCreateFontA@48". 1>C:\Users\User\C++\Hooks\VC++ Hook\Release\VC++ Hook.dll : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 1>Das Buildprotokoll wurde unter "file://c:\Users\User\C++\Hooks\VC++ Hook\VC++ Hook\Release\BuildLog.htm" gespeichert. 1>VC++ Hook - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen
main.h:
#pragma once #pragma comment(lib, "user32.lib") #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include "windows.h" #include <cstdio> #include "d3d9.h" #include "d3dx9.h" typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); EndScene_t pEndScene; ID3DXFont* pFont; void *DetourFunc(BYTE *src, const BYTE *dst, const int len) { BYTE *jmp = (BYTE*)malloc(len+5); DWORD dwback; VirtualProtect(src, len, PAGE_READWRITE, &dwback); memcpy(jmp, src, len); jmp += len; jmp[0] = 0xE9; *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5; src[0] = 0xE9; *(DWORD*)(src+1) = (DWORD)(dst - src) - 5; VirtualProtect(src, len, dwback, &dwback); return (jmp-len); } void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color) { D3DRECT rect = {X, Y, X+L, Y+H}; Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0); // bei Google gibt’s näheres } void DrawFont (int X, int Y, D3DCOLOR Color, char *format, ...) { char buffer[256]; va_list args; // deswegen: #include <cstdio> va_start (args, format); vsprintf (buffer,format, args); RECT FontRect = { X, Y, X + 120, Y + 16 }; pFont->DrawText( NULL, buffer, -1, &FontRect, DT_NOCLIP , Color ); // Zeichnen va_end (args); }
main.cpp:
#include "main.h" const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255); // Alpha, Rot, Grün, Blau const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255, 0, 255, 0); // Alpha, Rot, Grün, Blau const D3DCOLOR txtRot = D3DCOLOR_ARGB(255, 255, 0, 0); // Alpha, Rot, Grün, Blau const D3DCOLOR txtBlack = D3DCOLOR_ARGB(255, 0, 0, 0); // Alpha, Rot, Grün, Blau HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice)//die funktion, in der gemalt werden kann { // Schrift initialisieren -> Nur eimal! static char bFontCheck=0; static ID3DXFont *pFont=0; if (!bFontCheck) { D3DXCreateFont(pDevice, 14, 0, FW_NORMAL, 1, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &pFont ); ++bFontCheck; } // Schrift initialisiert DrawRect (pDevice, 10, 10, 200, 200, txtGreen); DrawFont (300, 50, txtBlack, "Deathly Assassin" ); return pEndScene(pDevice); } void InitHook() { HMODULE hModule = NULL; while ( !hModule ) { hModule = GetModuleHandleA( "d3d9.dll" ); // Handle zur DLL holen Sleep( 100 ); // 100ms warten } pEndScene = ( EndScene_t )DetourFunc((PBYTE) 0x4FDD71B0,(PBYTE)hkEndScene, 5); } int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: //starte hooking CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0); //beende hooking break; } return true; }
Habe breits mehrere Stunden gegoogelt und zwar Threads mit ähnlichen Problemen gefunden, jedoch nur sehr wenige und nichts hilfreiches..
Danke bereits im Vorraus!!!
-
First, remove the 'TEXT()' macros from Your call of the 'D3DXCreateFontA' function and try again.
Check that the path to the newest DirectX SDK .libs is the topmost in 'MainMenu->Tools->Options->Projects->VC++ Directories'. Also, check out the include directories. Then make sure that the function 'D3DXCreateFontA' from 'SDK\include\d3dx9core.h' has the same format with that one You use in your program. But it's strange that ASCII version of 'D3DXCreateFont' is called. Whether You set 'MainMenu->Project->Properties->General->Character Set' property to 'not set'... Exam it.
Note: All the strings You use (LPSTR) are ASCII coded. By the default VS 2005 uses unicode for its projects. Also unicode functions are faster on Win2000/XP/2003 then their ASCII variants. Using ASCII functions under the listed APIs will cause calling of suitable UNICODE functions. But it's vice versa under Win98.
P.S. At the begining You can also write '#undef UNICODE' and try to compile.
http://social.msdn.microsoft.com/Forums/en-US/gametechnologiesgeneral/thread/c6f5ec1e-6e25-46b8-85d9-6ea6fe382eec
Das war das erste Google-Ergebnis.
Checke in den Projekt-Einstellungen ob das Character-Set entweder auf Unicode oder auf Multibyte steht.
rya.
-
Beim Charset umstellen gibt es nur bei Unicode diesen Linker Error nicht.. Dafür aber jede menge LPCWSTR mängel, die der Compiler ersteinmal bemekkert
Ich würde mal ganz stark vermuten, dass wenn ich mein script in Unicode umforme nach dem berichtigen auch wieder der linker ärger macht
Danke trotzdem für den VorschlagIch habe es mal mit der IDE Code::Blocks und ebenfalls dem selben compiler probiert, doch kriege ich da trotz allen verlinkten verzeichnissen folgenden compiler fehler nachricht:
LINK||fatal error LNK1181: Eingabedatei "C:\Programme\CodeBlocks\MinGW\lib\x64\d3d9.lib" kann nicht geöffnet werden.|
Da ist man Moderator in anderen Foren und vielen anderen wie man meint weit vorraus, um dann festzustellen, dass man an einem einfachem compilerfehler verzweifelt :p *lol*
Danke wieder einmal für weitere vorschläge
-
Ich würde mal ganz stark vermuten, dass wenn ich mein script in Unicode umforme nach dem berichtigen auch wieder der linker ärger macht
Warum sollte er?
Nutze doch einfach Unicode fertig. Das Problem der "Umformung" der Strings kann man übrigens mit dem Macro _T() lösen, das je nach Einstellung ins nichts oder L"string" expandiert. Das ist in tchar.h definiert. Stell doch mal um auf Unicode und nutze das Macro. Ich denke dann ist das Problem gelöst. Ich erstelle seit Jahren meine Projekte nur noch in Unicode. Du kannst ja weiterhin char* bzw std::string nutzen, nur die Windows-Funktionen wie RegisterWindowClass etc verlange Unicode-Strings.
Und ehm, Visual C++ Express kann keine x64-Programme erstellen.Vllt solltest Du die 32bit-Libs nutzen.
rya.
-
Danke, aber ich habe mir bereits einen x64 compiler mit der Windows SDK geholt
Ty für das _T Macro, ich werd mein Glück versuchen
-
Ne, habe mein Script jetzt auf Unicode angepasst und bekomme wieder wie vermutet den _D3DXCreateFontA@48 error
-
Deathly Assassin schrieb:
Ne, habe mein Script jetzt auf Unicode angepasst und bekomme wieder wie vermutet den _D3DXCreateFontA@48 error
Nur ne vage Vermutung... aber mach mal um die DirectX-Includes ein extern "C":
extern "C"{ #include "foobar." }
rya.
-
Klappt auch nicht... Hätt mich aber auch gewundert, wenn die umwandelung der header zu C das linken beeinflusst hätte
Danke für deine Tatkräftige Hilfe! Wenn es mit Visual Express nicht klappt, gäbe es halt immernoch Code::Blocks als alternative.. dafür müsste ich aber herausfinden, warum dort die d3d9.lib nicht geöffnet werden kann
Habs schon mit berechtigungen etc. probiert... das verwunderliche über diesen error ist, dass der pfad nicht einmal existiert und er auch nirgentwo hinzugefügt worden ist... und selbst wenn müsste der linker sich die lib dann ja aus dem DirectX SDK gelinktem verzeichnis holen..Edit:
Ahhh, es hat sich endlich geklärrt..
Lag doch letzen endes am Compiler, weil der x64 compiler wohl nicht richtig übernommen wurde und er bei einem x86 compiler ne x64 lib öffnen wollteIch bin dir suuuuper dankbar für deine Hilfe!!
-
Hmm... Da ich aber MSVS Express benutze und man da kein x64 target einstellen kann muss ich wohl immernoch auf Code::Blocks zurück greifen.. einer von euch ne Idee wie man folgenden compiler fehler lösen kann?
LINK||fatal error LNK1181: Eingabedatei "C:\Programme\CodeBlocks\MinGW\lib\x64\d3d9.lib" kann nicht geöffnet werden.|
-
*push*
sitze noch auf folgendem Problem fest:LINK||fatal error LNK1181: Eingabedatei "C:\Programme\CodeBlocks\MinGW\lib\x64\d3d9.lib" kann nicht geöffnet werden.|