2009-03-30 30 views
6

Hem WinXP hem de Vista64 üzerinde çalışması gereken bir uygulama var. Programım, Vista'da çalışmak için değil, XP'de QueryFullProcessImageName() uygulamasını gerektirir.Çalışma Zamanı Denetimi Hatası # 0 yükleniyor QueryFullProcessImageName from kernel32.dll

Aynı yürütülebilir dosyanın hem WinXP hem de Vista'da çalışabilmesi için QueryFullProcessImageName() (statik olarak bağlamak yerine) kernel32.dll aracılığıyla yüklemeyi denerim. Bunu yükleyen kod şudur:

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

typedef Maalesef

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

olduğunu, işlev duruma gelmiş göstericiler zaman Vista'da bir çalışma zamanı hatası alıyorum:

çalışma zamanı kontrol Hatası # 0 - ESP değeri bir işlev çağrısında düzgün şekilde kaydedilmedi. Bu genellikle, bir arama kuralıyla bildirilen bir işlevi farklı bir çağrı kuralıyla bildirilen bir işlev işaretçisi ile çağırmanın bir sonucudur.

Yazım hatası, .h dosyasından doğrudan doğruya bu yüzden neden bozuk olduğunu anlayamıyorum. Herhangi bir yardım? Tonlarca çeşit denedim ama şans yok.

cevap

20

Statik bağımlılıkları ilan için kullanılan

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

WINBASEAPI için typedef değiştirmelidir ve __stdcall çağırma kuralını belirtmez. GetProcAddress() yöntemini kullanırsınız ve böylece statik bağımlılık ilginizi çekmez, ancak uygun çağrı çağrısı için hala __stdcall öğesine ihtiyacınız vardır.