2009-03-30 6 views
6

J'ai une application qui doit être exécutée sous WinXP et Vista64. Mon programme nécessite QueryFullProcessImageName() pour fonctionner sur Vista mais pas sur XP.Échec de vérification au moment de l'exécution # 0 loading QueryFullProcessImageName from kernel32.dll

Je tente de charger QueryFullProcessImageName() (au lieu de relier statiquement) via kernel32.dll afin que le même exécutable puisse fonctionner sur WinXP et Vista. Le code qui charge est:

//only gets called on vista 
bool LoadQueryFullProcessImageName() 
{ 
    HMODULE hDLL = LoadLibrary("kernel32.dll"); 
    if (!hDLL) return(0); 

    //Now use pointer to get access to functions defined in DLL 
    fpQueryFullProcessImageName = (LPQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version 
    if (!fpQueryFullProcessImageName) 
    return false; 

    return true; 
} 

le typedef est

typedef WINBASEAPI 
BOOL (*LPQueryFullProcessImageName)(
    __in HANDLE hProcess, 
    __in DWORD dwFlags, 
    __out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName, 
    __inout PDWORD lpdwSize 
    ); 

Malheureusement, je reçois une erreur de temps d'exécution sur Vista lorsque le pointeur de fonction est déréférencé:

Run-Time Échec de la vérification # 0 - La valeur de ESP n'a pas été enregistrée correctement lors d'un appel de fonction. Ceci est généralement le résultat de l'appel d'une fonction déclarée avec une convention d'appel avec un pointeur de fonction déclaré avec une convention d'appel différente.

Le typedef est directement à partir du fichier .h donc je ne peux pas comprendre pourquoi il est en train de tout chambouler. De l'aide? J'ai essayé des tonnes de variantes mais pas de chance.

Répondre

20

Vous devez modifier le typedef à

typedef BOOL (WINAPI *LPQueryFullProcessImageName)(
    HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize); 

WINBASEAPI est utilisé pour déclarer les dépendances statiques et il ne précise pas la convention d'appel __stdcall. Vous utilisez GetProcAddress() et donc la dépendance statique ne vous intéresse pas, mais vous avez toujours besoin de __stdcall pour une invocation d'appel correcte.

Questions connexes