2009-03-30 21 views
6

Tengo una aplicación que necesita ejecutarse tanto en WinXP como en Vista64. Mi programa requiere que QueryFullProcessImageName() funcione en Vista, pero no en XP.Error de comprobación en tiempo de ejecución # 0 cargando QueryFullProcessImageName desde kernel32.dll

Intento cargar QueryFullProcessImageName() (en lugar de vincular estáticamente) a través de kernel32.dll para que el mismo ejecutable se pueda ejecutar en WinXP y Vista. El código que carga es:

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

el typedef es

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

Por desgracia, me sale un error de tiempo de ejecución en Vista cuando el puntero de función se eliminan las referencias:

Run-Time Check Fracaso # 0: el valor de ESP no se guardó correctamente en una llamada a función. Esto suele ser el resultado de llamar a una función declarada con una convención de llamada con un puntero de función declarado con una convención de llamada diferente.

El typedef es directo desde el archivo .h, así que no puedo entender por qué está estropeando. ¿Alguna ayuda? He intentado toneladas de variantes, pero no tuve suerte.

Respuesta

20

debe cambiar el typedef a

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

WINBASEAPI se utiliza para declarar dependencias estáticas y no especifica la convención __stdcall llamando. Utiliza GetProcAddress() y, por lo tanto, la dependencia estática no le interesa, pero aún necesita __stdcall para la invocación correcta de llamadas.

Cuestiones relacionadas