Problem mit WinAPI wahrscheinlich wegen Unicode



  • 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 .lib

    das 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!


Anmelden zum Antworten