2013-11-23 59 views
1

首先是我已經搜索了一段時間,並且找不到與我的案例有關的任何答案。基本上我試圖得到一個函數的地址在一個Windows DLL(dnsapi.dll)和GetProcAddress返回0.經過一段時間的撓頭,我甚至還創建了一個簡單地使用MessageBox的GetProcAddress在user32中的程序。 DLL。同樣的結果。這裏是我做了第二程序的代碼仍然不工作:GetProcAddress返回0對於所有功能

#include <stdio.h> 
#include <Windows.h> 

int main() { 
    HINSTANCE hLib = LoadLibrary(TEXT("user32.dll")); 
    DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, "MessageBox"); 

    printf("%ld", MsgBoxAddr); 
    getchar(); 

    return 0; 
} 

BTW GetLastError返回127,這似乎是在GetProcAddress的不工作,但我想不出返回的最常見的錯誤什麼是錯誤的,我已經嘗試過很多函數和DLL,而不僅僅是這些對。

謝謝。 :)

編輯: 鏈接的文章解決了我的問題,我試過的功能都有unicode和各種版本(w和a)。使用完整的API名稱解決了問題。感謝您鏈接該問題。

謝謝。

回答

5

一些常見的API不是函數的真實名稱,包括LoadLibraryGetProcAddressMessageBox。所有這些功能都不存在!

這是因爲Windows API以文本爲參數將有兩個版本,一個接受ANSI文本和其他接受UNICODE文本。你知道的那些「函數」實際上是預處理器宏,它會根據你的Visual Studio項目的默認字符集自動將你路由到正確的函數。例如,

MessageBox不存在。存在的功能有MessageBoxAMessageBoxW,其中一個用於UNICODE的ANSI。因此,這是你將如何得到他們的地址:

ANSI:

HINSTANCE hLib = LoadLibraryA("user32.dll"); 
DWORD MsgBoxAddr = (DWORD)GetProcAddressA(hLib, "MessageBoxA"); 

UNICODE:

HINSTANCE hLib = LoadLibraryW(L"user32.dll"); 
DWORD MsgBoxAddr = (DWORD)GetProcAddressW(hLib, L"MessageBoxW"); 

自動:

HINSTANCE hLib = LoadLibrary(TEXT("user32.dll")); 
#ifdef UNICODE 
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, TEXT("MessageBoxW")); 
#else 
DWORD MsgBoxAddr = (DWORD)GetProcAddress(hLib, TEXT("MessageBoxA")); 
#endif 
2

Havenard已經給出了答案,所以不要」不要接受我的(但請閱讀它)。

一個更好的辦法來解決這個問題是定義:

#ifndef _CRT_STRINGIZE // Might be already defined in crtdefs.h, but if not... 
#define __CRT_STRINGIZE(Value) #Value 
#define _CRT_STRINGIZE(Value) __CRT_STRINGIZE(Value) 
#endif 

然後用

GetProcAddress(hLib, TEXT(_CRT_STRINGIZE(MessageBox))); 
+1

+1好:)'/ *註釋必須長度至少爲15個字符。 * /' – Paul