GetProcAddress 使用注意事項

2021-05-27 09:40:36 字數 1620 閱讀 1714

使用getprocaddress function

時,有以下幾點需要特別留意:

1. 第二個引數型別是lpcstr,不是lpctstr

2. 用 __declspec(dllexport),按 c 名稱修飾(extern "c") 匯出的函式名,對於 __stdcall 和 __fastcall 呼叫約定是相同的;對 __cdecl 是不同的(匯出的函式名沒有前面的下劃線);

3. 即使返回值不是 null,也有可能發生錯誤。當 .def 模組不是連續地從 1 開始編號 ordinal 值,那麼,如果用乙個無函式對應的 ordinal 值呼叫 getprocaddress,就會發生錯誤,返回乙個無效的非null位址; 

4. 最好用函式名,而不是 ordinal 值呼叫 getprocaddress,以避免不同版本 dll 中某些函式不存在的情況。

注:確認 dll 的匯出函式名,可以用dumpbin /exports dll_file_name.dll命令,然後檢視name列。

// the myputs function writes a null-terminated string to

// the standard output device.

// the export mechanism used here is the __declspec(export)

// method supported by microsoft visual studio, but any

// other export method supported by your development

// environment may be substituted.

#include #define eof (-1)

#ifdef __cplusplus // if used by c++ code,

extern "c"

return 1;}

#ifdef __cplusplus

}#endif

// a ****** program that uses loadlibrary and 

// getprocaddress to access myputs from myputs.dll.

#include #include typedef int (__cdecl *myproc)(lptstr); // __cdecl | __stdcall | __fastcall

void main(void)

// free the dll module.

ffreeresult = freelibrary(hinstlib);

} // if unable to call the dll function, use an alternative.

if (! fruntimelinksuccess)

printf("message via alternative method\n");

}

關於GetProcAddress和名稱修飾

dllexport屬性告訴鏈結器 請將指定的函式標記為匯出並為它生成乙個匯出項。這個匯出項是經過修飾的,對於匯出多個過載的函式來說,匯出修飾後的名稱是十分必要的。但是,這也意味著 你傳入到getprocaddress函式中的函式字串也需要是修飾版本的。從我們之前的幾篇關於呼叫約定的文章中,我們知道,...

GetProcAddress的二分查詢

只要稍微熟悉pe結構就能很快寫出來,getprocaddress的原型如下 farproc winapi getprocaddress hmodule hmodule,lpcstr lpprocname hmodule是指模組的基位址,比如用loadlibrary載入dll返回的位址 lpprocn...

VMware License Server使用經驗

近期在測試vmware server,在使用vmware license server的時候碰到一些問題,經過兩天的實驗,問題得以解決,現記錄如下,以供朋友們參考。1 複製license檔案 在安裝vmware virtualcenter的時候,會一同安裝license server伺服器。如果你在...