使用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伺服器。如果你在...