2009-03-30 7 views
6

से मेरे पास एक ऐसा एप्लिकेशन है जिसे WinXP और Vista64 दोनों पर चलाने की आवश्यकता है। मेरे प्रोग्राम को Vista पर काम करने के लिए QueryFullProcessImageName() की आवश्यकता है लेकिन XP पर नहीं।रन-टाइम चेक विफलता # 0 लोडिंग QueryFullProcessImageName kernel32.dll

मैं kernel32.dll के माध्यम से QueryFullProcessImageName() (स्थिर रूप से लिंक करने के बजाय) लोड करने का प्रयास करता हूं ताकि एक ही निष्पादन योग्य WinXP और Vista दोनों पर चल सके। कोड है कि यह लोड करता है:

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

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

दुर्भाग्य से, जब समारोह सूचक dereferenced है मैं Vista पर एक रन समय त्रुटि मिलती है:

रन-टाइम जांच विफलता # 0 - ईएसपी का मूल्य फ़ंक्शन कॉल में ठीक तरह से सहेजा नहीं गया था। यह आमतौर पर एक कॉलिंग कन्वेंशन के साथ घोषित फ़ंक्शन को कॉल करने का परिणाम होता है जिसमें एक अलग कॉलिंग सम्मेलन के साथ घोषित फ़ंक्शन पॉइंटर होता है।

टाइपपीफ सीधे .h फ़ाइल से है इसलिए मुझे समझ में नहीं आ रहा है कि यह गड़बड़ क्यों कर रहा है। कोई मदद? मैंने कई प्रकार की कोशिश की है लेकिन कोई भाग्य नहीं है।

उत्तर

20

आप को

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

WINBASEAPI typedef बदलना चाहिए स्थिर निर्भरता की घोषणा के लिए प्रयोग किया जाता है और यह __stdcall बुला सम्मेलन निर्दिष्ट नहीं है। आप GetProcAddress() का उपयोग करते हैं और इसलिए स्थैतिक निर्भरता आपके लिए कोई रूचि नहीं है, लेकिन आपको अभी भी उचित कॉल आमंत्रण के लिए __stdcall की आवश्यकता है।

संबंधित मुद्दे