2009-03-30 11 views
6

Ho un'applicazione che deve essere eseguita sia su WinXP che Vista64. Il mio programma richiede QueryFullProcessImageName() per funzionare su Vista ma non su XP.Errore in fase di esecuzione # 0 caricamento QueryFullProcessImageName da kernel32.dll

Provo a caricare QueryFullProcessImageName() (invece di collegare staticamente) tramite kernel32.dll in modo che lo stesso eseguibile possa essere eseguito su WinXP e Vista. Il codice che carica è:

//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; 
} 

il typedef è

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

Purtroppo, ottengo un errore di tempo di esecuzione su Vista quando il puntatore a funzione viene dereference:

Run-Time Check Failure # 0 - Il valore di ESP non è stato salvato correttamente attraverso una chiamata di funzione. Questo di solito è il risultato del richiamo di una funzione dichiarata con una convenzione di chiamata con un puntatore di funzione dichiarato con una convenzione di chiamata diversa.

Il typedef è direttamente dal file .h, quindi non riesco a capire perché sta rovinando. Qualsiasi aiuto? Ho provato un sacco di varianti ma senza fortuna.

risposta

20

è necessario modificare il typedef per

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

WINBASEAPI viene utilizzato per dichiarare le dipendenze statiche e non specifica la convenzione __stdcall chiamando. Usi GetProcAddress() e quindi la dipendenza statica non ti interessa, ma hai ancora bisogno di __stdcall per il corretto richiamo delle chiamate.

Problemi correlati