2009-03-30 8 views
6

Ich habe eine Anwendung, die sowohl auf WinXP und Vista64 ausgeführt werden muss. Mein Programm benötigt QueryFullProcessImageName() um unter Vista, aber nicht unter XP zu arbeiten.Run-Time Check Fehler # 0 laden QueryFullProcessImageName von kernel32.dll

Ich versuche QueryFullProcessImageName() zu laden (anstatt statisch zu verknüpfen) über die kernel32.dll, so dass die gleiche ausführbare Datei auf WinXP und Vista ausgeführt werden kann. Der Code, lädt es ist:

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

die typedef ist

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

Leider habe ich einen Laufzeitfehler auf Vista erhalten, wenn der Funktionszeiger dereferenziert wird:

Run-Time Check Failure # 0 - Der Wert von ESP wurde während eines Funktionsaufrufs nicht ordnungsgemäß gespeichert. Dies ist normalerweise ein Ergebnis des Aufrufs einer Funktion, die mit einer Aufrufkonvention deklariert wurde, mit einem Funktionszeiger, der mit einer anderen Aufrufkonvention deklariert wurde.

Der Typdef ist direkt aus der .h-Datei, so dass ich nicht verstehen kann, warum es verhext. Irgendeine Hilfe? Ich habe Tonnen von Varianten versucht, aber kein Glück.

Antwort

20

Sie sollten die typedef

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

WINBASEAPI ändern für die Deklaration von statischen Abhängigkeiten verwendet wird und es die __stdcall Aufrufkonvention nicht angeben. Sie verwenden GetProcAddress() und daher ist die statische Abhängigkeit für Sie nicht von Interesse, aber Sie benötigen weiterhin __stdcall für die ordnungsgemäße Anrufaufruffunktion.