Run-Time Check Failure - Problem mit function pointer + calling convention



  • Aloha,
    ich erhalte folgende Fehlermeldung beim Aufruf einer Funktion über einen function pointer:

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

    Eigentlich ist mir auch klar was diese Fehlermeldung bedeutet, aber meiner Meinung nach ist der function pointer mit der gleichen calling convention deklariert wie die ursprüngliche Funktion.

    function pointer:

    typedef HRESULT (WINAPI * D3DX10CREATEEFFECTFROMRESOURCE)(HMODULE, LPCTSTR, LPCTSTR, CONST D3D10_SHADER_MACRO *, ID3D10Include *, LPCSTR, UINT, UINT, ID3D10Device *, ID3D10EffectPool *, ID3DX10ThreadPump *, ID3D10Effect **, ID3D10Blob **, HRESULT *);
    D3DX10CREATEEFFECTFROMRESOURCE pfnD3DX10CreateEffectFromResourceW;
    #ifdef UNICODE
    #define pfnD3DX10CreateEffectFromResource pfnD3DX10CreateEffectFromResourceW
    #endif
    

    original Funktionsdefinition: <D3DX10Async.h>

    HRESULT WINAPI D3DX10CreateEffectFromResourceW(HMODULE hModule, LPCWSTR pResourceName, LPCWSTR pSrcFileName, CONST D3D10_SHADER_MACRO *pDefines, 
        ID3D10Include *pInclude, LPCSTR pProfile, UINT HLSLFlags, UINT FXFlags, ID3D10Device *pDevice, 
        ID3D10EffectPool *pEffectPool, ID3DX10ThreadPump* pPump, ID3D10Effect **ppEffect, ID3D10Blob **ppErrors, HRESULT* pHResult);
    

    Hier ein Auszug vom holen des function pointers:

    m_hD3DX10DllHandle = LoadLibrary(TEXT("D3DX10.dll"));
    if(m_hD3DX10DllHandle)
    {
    	pfnD3DX10CreateEffectFromResourceW = (D3DX10CREATEEFFECTFROMRESOURCE)GetProcAddress(m_hD3DX10DllHandle, "D3DX10CreateEffectFromResourceW");
    ...
    

    und zuletzt das Aufrufen der Funktion bei der ich dann die oben genannte Fehlermeldung erhalte:

    // Create the effect
    if(pfnD3DX10CreateEffectFromResource)
    	hr = pfnD3DX10CreateEffectFromResource(hLibHandle, TEXT("IDR_EFFECTFILE1"), TEXT("IDR_EFFECTFILE1"), NULL, NULL, NULL, D3D10_SHADER_ENABLE_STRICTNESS, 0, m_pd3dDevice10, NULL, NULL, &m_pEffect, NULL, NULL);
    if(FAILED(hr))
    	return false;
    

    Der function pointer ist definitiv gültig und WINAPI sollte ja bei beiden laut <windef.h> gleich als

    #define WINAPI      __stdcall
    

    definiert sein, daher ist mir nicht ganz klar wieso ich diese Fehlermeldung bekomme.
    Kann mir da jemand weiterhelfen?
    Gruß,
    Umek


  • Mod

    der fehler bedeutet dass der stack kaputt ging.
    das hat nicht wirklich was mit der calling convention zu tun, die kann ein grund von vielen sein dass das passiert.

    wieso benutzt du D3D nicht wie jeder andere auch statt alles per hand zu machen?



  • rapso schrieb:

    der fehler bedeutet dass der stack kaputt ging.
    das hat nicht wirklich was mit der calling convention zu tun, die kann ein grund von vielen sein dass das passiert.

    hmm, okay, dann such ich nochmal weiter.

    rapso schrieb:

    wieso benutzt du D3D nicht wie jeder andere auch statt alles per hand zu machen?

    Damit meine binary DX10 unterstützen kann und trotzdem unter XP läuft


  • Mod

    dann waere es einfacher eine xp und eine d3d10 version zu machen. zu wuerdest du es dir auch ersparen zur laufzeit immer zwischen xp und d3d10 zu entscheiden.



  • rapso schrieb:

    dann waere es einfacher eine xp und eine d3d10 version zu machen. zu wuerdest du es dir auch ersparen zur laufzeit immer zwischen xp und d3d10 zu entscheiden.

    Ja das wäre möglich, allerdings stelle ich mich für gewöhnlich meinen Problemen und laufe nicht vor ihnen weg, von daher hilft mir das jetzt auch nicht weiter 😉

    Vielmehr wäre es interessanter was denn diesen Fehler noch verursachen könnte...


  • Mod

    Umek schrieb:

    rapso schrieb:

    dann waere es einfacher eine xp und eine d3d10 version zu machen. zu wuerdest du es dir auch ersparen zur laufzeit immer zwischen xp und d3d10 zu entscheiden.

    Ja das wäre möglich, allerdings stelle ich mich für gewöhnlich meinen Problemen und laufe nicht vor ihnen weg, von daher hilft mir das jetzt auch nicht weiter 😉

    gut, mehr als dir das problem zu erklaeren und eine gute loesung zu sagen kann ich ja auch nicht 😉



  • rapso schrieb:

    Umek schrieb:

    rapso schrieb:

    dann waere es einfacher eine xp und eine d3d10 version zu machen. zu wuerdest du es dir auch ersparen zur laufzeit immer zwischen xp und d3d10 zu entscheiden.

    Ja das wäre möglich, allerdings stelle ich mich für gewöhnlich meinen Problemen und laufe nicht vor ihnen weg, von daher hilft mir das jetzt auch nicht weiter 😉

    gut, mehr als dir das problem zu erklaeren und eine gute loesung zu sagen kann ich ja auch nicht 😉

    naja, nimms mir nicht übel, aber ne Lösung war das ja nicht gerade 😛

    Blicke durch den Fehler einfach nicht durch, hab mittlerweile eine weitere Funktion aus d3dx10.dll ausprobiert, D3DX10CreateEffectFromFile, funktioniert auch nicht.

    Aber generell an der herangehensweise kann es nicht liegen, da ich die ganzen CreateDevice Funktionen für DX9, 9Ex, 10, 10.1 und 11 alle aufrufen und auch erfolgreich ausführen kann, inklusive render Ergebnis...



  • Okay, ich bin nochmal einen Schritt weiter, und zwar kriege ich für

    hr = D3DX10CheckVersion(D3D10_SDK_VERSION, D3DX10_SDK_VERSION);
    

    E_FAIL zurück.
    Das heißt laut Doku:

    Verify that the version of D3DX you compiled with is the version that you are running.

    öhm?
    Also sehe ich das richtig das meine DXRuntimes neuer/älter sind als die libs vom SDK? 😮

    Win 7
    VS 2008
    Platform SDK 7.0A
    DirectX SDK March 09

    Was mach ich dagegen? 😕



  • Um das ganze abzuschließen Poste ich auch gleich nochmal meine Lösung.

    Da für jede neue D3DX Version eine neue DLL geschrieben wird muss auch dementsprechend die letzte Version mit der compiliert wird geladen werden.

    In meinem Falle also nicht

    m_hD3DX10DllHandle = LoadLibrary(TEXT("D3DX10.dll"));
    

    sondern

    m_hD3DX10DllHandle = LoadLibrary(TEXT("D3DX10_41.dll"));
    

    Damit haben sich meine Probleme dann gelöst.


Anmelden zum Antworten