DLL转Lib
在C++中,為了允許操作符重載和函數(shù)重載,C++編譯器往往按照某種規(guī)則改寫每一個(gè)入口點(diǎn)的符號(hào)名,以便使用同一個(gè)名字(具有不同的參數(shù)類型或者是不同的作用域)有多種不同的用法,而不會(huì)打破現(xiàn)有基于C的鏈接器,.這項(xiàng)技術(shù)通常被稱為改編(Name Mangling)或者名稱修飾(Name Decoration),許多C++編譯器廠商選擇了自己的名稱修飾方案.
在VC++中,函數(shù)修飾名有編譯類型(C或C++),函數(shù)名,類名,調(diào)用約定,返回類型,參數(shù)等多種因素決定.關(guān)于名稱修飾的東西很多,下面僅僅簡(jiǎn)單的談一下常用的C編譯,C++編譯函數(shù)名修飾
一.C編譯時(shí)函數(shù)名修飾約定規(guī)則
(1)_stdcall調(diào)用約定在輸出函數(shù)名前面加上一個(gè)下劃線前綴,后面加上一個(gè)"@"符號(hào)和其參數(shù)字節(jié)數(shù),格式_functionname@number
(2)_cedecl調(diào)用約定僅在輸出函數(shù)名稱前加上一個(gè)下劃線的前綴,格式為_(kāi)functionname
(3)_fastcall調(diào)用約定在輸出函數(shù)名前面加上一個(gè)"@",后面加上一個(gè)"@"和參數(shù)字節(jié)數(shù),格式@functionname@number
二.C++編譯時(shí)函數(shù)名修飾約定規(guī)則
(1)_stdcall調(diào)用約定以"?"標(biāo)識(shí)函數(shù)名的開(kāi)始,后面跟函數(shù)名;函數(shù)名后以"@@YG"標(biāo)識(shí)參數(shù)表的開(kāi)始,后跟參數(shù)表;參數(shù)表的第一項(xiàng)為該函數(shù)的返回值類型,其后一次為參數(shù)的數(shù)據(jù)類型,指針標(biāo)識(shí)在其所指數(shù)據(jù)類型前;參數(shù)表后以"@Z"標(biāo)識(shí)整個(gè)名字結(jié)束,如果該函數(shù)無(wú)參數(shù),則以為"Z"標(biāo)識(shí)結(jié)尾.其格式為: "?functionname@@YG*****@Z"或者"?functionname@@YG*XZ"
(2)_cdecl調(diào)用約定同上面的_stdcall,只是參數(shù)表的開(kāi)始由上面的@@YG變成了@@YA
(3)_fastcall調(diào)用約定規(guī)則同上_stdcall,只是參數(shù)表由"@@YG"變成了"@@YI"
--------------------------------------------------------------------------------------------------------------------------
從dll導(dǎo)出lib文件
一、使用VC++的工具DUMPBIN將DLL中的導(dǎo)出函數(shù)表導(dǎo)出到一定義(.DEF)文件
EXAMPLE:
DUMPBIN SkinH.dll /EXPORTS /OUT:SkinH.def
Dump of file G:\Programing\VC6.0\Test123\SkinH.dll
File Type: DLL
? Section contains the following exports for SkinH_VB6.dll
?????????? 0 characteristics
??? 4AAEFE79 time date stamp Tue Sep 15 10:39:53 2009
??????? 0.00 version
?????????? 1 ordinal base
????????? 23 number of functions
????????? 23 number of names
??? ordinal hint RVA????? name
????????? 1??? 0 00025FF0 SkinH_AdjustAero
????????? 2??? 1 00025FC0 SkinH_AdjustHSV
????????? 3??? 2 00025F00 SkinH_Attach
????????? 4??? 3 00025F10 SkinH_AttachEx
????????? 5??? 4 00025F30 SkinH_AttachExt
????????? 6??? 5 00025F60 SkinH_AttachRes
????????? 7??? 6 00025F90 SkinH_AttachResEx
????????? 8??? 7 000260A0 SkinH_Detach
????????? 9??? 8 000260B0 SkinH_DetachEx
???????? 10??? 9 000260C0 SkinH_GetColor
???????? 11??? A 00026060 SkinH_LockUpdate
???????? 12??? B 00026080 SkinH_Map
???????? 13??? C 00026130 SkinH_NineBlt
???????? 14??? D 00025FE0 SkinH_SetAero
???????? 15??? E 000261D0 SkinH_SetBackColor
???????? 16??? F 00026160 SkinH_SetFont
???????? 17?? 10 00026180 SkinH_SetFontEx
???????? 18?? 11 000261F0 SkinH_SetForeColor
???????? 19?? 12 00026030 SkinH_SetMenuAlpha
???????? 20?? 13 00026100 SkinH_SetTitleMenuBar
???????? 21?? 14 00026040 SkinH_SetWindowAlpha
???????? 22?? 15 000260E0 SkinH_SetWindowMovable
???????? 23?? 16 00026210 SkinH_VerifySign
? Summary
?????? 1D000 .52PoJie
?????? 39000 .Hmily
1)添加LIB說(shuō)明 LIBRARY "SkinH"??????????? ;DLL名稱
DESCRIPTION "SkinH library"?
2)去掉導(dǎo)出函數(shù)說(shuō)明端以外的內(nèi)容,在LIB說(shuō)明下添加 "EXPROTS" 說(shuō)明導(dǎo)出函數(shù)
3)將所有的函數(shù)放至行首,去掉 "hint" 和 "RVA" 數(shù)據(jù),留下函數(shù)的序號(hào) "ordinal" ,在序號(hào)前加上 "@" 符號(hào) 形成 "_導(dǎo)出函數(shù)名@參數(shù)字節(jié)和 @序號(hào)" 此種格式(__stdcall 方式調(diào)用導(dǎo)出的函數(shù)符號(hào)是 "函數(shù)名稱@參數(shù)字節(jié)和"). 最后形成.DEF文件如下:
LIBRARY "SkinH"
DESCRIPTION "SkinH_VB6 library"
EXPORTS
SkinH_AdjustAero@0?@1
SkinH_AdjustHSV@0?@2
SkinH_Attach@0?@3
SkinH_AttachEx@8?@4
SkinH_AttachExt@0?@5
SkinH_AttachRes@0?@6
SkinH_AttachResEx@0?@7
SkinH_Detach@0?@8
SkinH_DetachEx@0?@9
SkinH_GetColor@0?@10
SkinH_LockUpdate@0?@11
SkinH_Map@0?@12
SkinH_NineBlt@0?@13
SkinH_SetAero@4?@14
SkinH_SetBackColor@0?@15
SkinH_SetFont@0?@16
SkinH_SetFontEx@0?@17
SkinH_SetForeColor@0?@18
SkinH_SetMenuAlpha@0?@19
SkinH_SetTitleMenuBar@0?@20
SkinH_SetWindowAlpha@8?@21
SkinH_SetWindowMovable@0?@22
SkinH_VerifySign@0?@23
當(dāng)然 有的函數(shù) 我沒(méi)有用的? 我就全部給了0
4)使用VC++的LIB工具,帶/DEF:(.def文件名) /MACHINE:IX86(80X86機(jī)器),就輸出符合VC++格式的的LIB文件了.
EXAMPLE:LIB /DEF:SkinH.def /MACHINE:IX86
5)接時(shí)帶上LIB文件鏈接;注意的是當(dāng)有些動(dòng)態(tài)庫(kù)DUMPBIN的只有函數(shù)名,無(wú)"@nn"的參數(shù)格式,如C++Builder寫的DLL,輸出就只有函數(shù)名符號(hào),鏈接時(shí)就會(huì)報(bào)錯(cuò): error LNK2002:unresolved external symbol "functionname@nn" 提示程序中引入的函數(shù)符號(hào)無(wú)法識(shí)別,這時(shí)只要將DEF文件中相應(yīng)的函數(shù)名稱改為functionname@nn方式,重新建立 LIB,重新鏈接即可.
最后還有一句,要自動(dòng)生成.h文件好象是不行的.因?yàn)閐ll里沒(méi)有保存函數(shù)原型,需要反匯編并分析代碼才知道每個(gè)函數(shù)的參數(shù)情況.
extern "C" BOOL WINAPI SkinH_AttachEx(LPCTSTR strSkin,LPCTSTR strPwd);
extern "C" BOOL WINAPI SkinH_SetWindowAlpha(HWND hWnd,DWORD nAlpha);
extern "C" BOOL WINAPI SkinH_SetAero(DWORD nEnable);
最后函數(shù)頭添加聲明?
就可以調(diào)用了 - -!
?
相關(guān)參考:
http://blog.sina.com.cn/s/blog_4c72efa6010092m5.html
http://blog.csdn.net/tingsking18/article/details/5394466
?
?
總結(jié)
- 上一篇: 华为nova多少钱啊?
- 下一篇: 衡水老白干多少钱啊?