日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

DLL转Lib

發(fā)布時間:2023/12/1 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DLL转Lib 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在C++中,為了允許操作符重載和函數(shù)重載,C++編譯器往往按照某種規(guī)則改寫每一個入口點的符號名,以便使用同一個名字(具有不同的參數(shù)類型或者是不同的作用域)有多種不同的用法,而不會打破現(xiàn)有基于C的鏈接器,.這項技術(shù)通常被稱為改編(Name Mangling)或者名稱修飾(Name Decoration),許多C++編譯器廠商選擇了自己的名稱修飾方案.

在VC++中,函數(shù)修飾名有編譯類型(C或C++),函數(shù)名,類名,調(diào)用約定,返回類型,參數(shù)等多種因素決定.關(guān)于名稱修飾的東西很多,下面僅僅簡單的談一下常用的C編譯,C++編譯函數(shù)名修飾
一.C編譯時函數(shù)名修飾約定規(guī)則
(1)_stdcall調(diào)用約定在輸出函數(shù)名前面加上一個下劃線前綴,后面加上一個"@"符號和其參數(shù)字節(jié)數(shù),格式
_functionname@number
(2)_cedecl調(diào)用約定僅在輸出函數(shù)名稱前加上一個下劃線的前綴,格式為_functionname
(3)_fastcall調(diào)用約定在輸出函數(shù)名前面加上一個"@",后面加上一個"@"和參數(shù)字節(jié)數(shù),格式@functionname@number

二.C++編譯時函數(shù)名修飾約定規(guī)則
(1)_stdcall調(diào)用約定以"?"標識函數(shù)名的開始,后面跟函數(shù)名;函數(shù)名后以"@@YG"標識參數(shù)表的開始,后跟參數(shù)表;參數(shù)表的第一項為該函數(shù)的返回值類型,其后一次為參數(shù)的數(shù)據(jù)類型,指針標識在其所指數(shù)據(jù)類型前;參數(shù)表后以"@Z"標識整個名字結(jié)束,如果該函數(shù)無參數(shù),則以為"Z"標識結(jié)尾.其格式為: "
?functionname@@YG*****@Z"或者"?functionname@@YG*XZ"
(2)_cdecl調(diào)用約定同上面的_stdcall,只是參數(shù)表的開始由上面的@@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說明 LIBRARY "SkinH"??????????? ;DLL名稱
DESCRIPTION "SkinH library"?
2)去掉導(dǎo)出函數(shù)說明端以外的內(nèi)容,在LIB說明下添加 "EXPROTS" 說明導(dǎo)出函數(shù)
3)將所有的函數(shù)放至行首,去掉 "hint" 和 "RVA" 數(shù)據(jù),留下函數(shù)的序號 "ordinal" ,在序號前加上 "@" 符號 形成 "_導(dǎo)出函數(shù)名@參數(shù)字節(jié)和 @序號" 此種格式(__stdcall 方式調(diào)用導(dǎo)出的函數(shù)符號是 "函數(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ù) 我沒有用的? 我就全部給了0

4)使用VC++的LIB工具,帶/DEF:(.def文件名) /MACHINE:IX86(80X86機器),就輸出符合VC++格式的的LIB文件了.
EXAMPLE:LIB /DEF:SkinH.def /MACHINE:IX86

5)接時帶上LIB文件鏈接;注意的是當(dāng)有些動態(tài)庫DUMPBIN的只有函數(shù)名,無"@nn"的參數(shù)格式,如C++Builder寫的DLL,輸出就只有函數(shù)名符號,鏈接時就會報錯: error LNK2002:unresolved external symbol "functionname@nn" 提示程序中引入的函數(shù)符號無法識別,這時只要將DEF文件中相應(yīng)的函數(shù)名稱改為functionname@nn方式,重新建立 LIB,重新鏈接即可.

最后還有一句,要自動生成.h文件好象是不行的.因為dll里沒有保存函數(shù)原型,需要反匯編并分析代碼才知道每個函數(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é)

以上是生活随笔為你收集整理的DLL转Lib的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。