2009-03-30 42 views
6

Tôi có một ứng dụng cần chạy cả trên WinXP và Vista64. Chương trình của tôi yêu cầu QueryFullProcessImageName() để làm việc trên Vista nhưng không phải trên XP.Kiểm tra thời gian chạy thất bại # 0 loading QueryFullProcessImageName từ kernel32.dll

Tôi cố gắng tải QueryFullProcessImageName() (thay vì liên kết tĩnh) thông qua kernel32.dll để cùng một tệp thực thi có thể chạy trên cả WinXP và Vista. Mã tải đó là:

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

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

Thật không may, tôi nhận được một lỗi thời gian chạy trên Vista khi con trỏ hàm được dereferenced:

Run-Time Kiểm tra Failure # 0 - Giá trị của ESP không được lưu đúng cách trong một cuộc gọi hàm. Đây thường là kết quả của việc gọi một hàm được khai báo với một quy ước gọi bằng một con trỏ hàm được khai báo với một quy ước gọi khác.

Máy đánh chữ thẳng từ tệp .h nên tôi không thể hiểu tại sao nó lại rối tung lên. Bất kỳ giúp đỡ? Tôi đã thử rất nhiều biến thể nhưng không may mắn.

Trả lời

20

Bạn nên thay đổi các typedef để

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

WINBASEAPI được sử dụng để khai báo phụ thuộc tĩnh và nó không xác định ước __stdcall gọi. Bạn sử dụng GetProcAddress() và vì vậy sự phụ thuộc tĩnh là không quan tâm đến bạn, nhưng bạn vẫn cần __stdcall cho lời gọi thích hợp.

Các vấn đề liên quan