DLL轉Lib

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

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

二.C++編譯時函數名修飾約定規則
(1)_stdcall調用約定以"?"標識函數名的開始,后面跟函數名;函數名后以"@@YG"標識參數表的開始,后跟參數表;參數表的第一項為該函數的返回值類型,其后一次為參數的數據類型,指針標識在其所指數據類型前;參數表后以"@Z"標識整個名字結束,如果該函數無參數,則以為"Z"標識結尾.其格式為: "
?functionname@@YG*****@Z"或者"?functionname@@YG*XZ"
(2)_cdecl調用約定同上面的_stdcall,只是參數表的開始由上面的@@YG變成了@@YA
(3)_fastcall調用約定規則同上_stdcall,只是參數表由"@@YG"變成了"@@YI"
--------------------------------------------------------------------------------------------------------------------------
從dll導出lib文件
一、使用VC++的工具DUMPBIN將DLL中的導出函數表導出到一定義(.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)去掉導出函數說明端以外的內容,在LIB說明下添加 "EXPROTS" 說明導出函數
3)將所有的函數放至行首,去掉 "hint" 和 "RVA" 數據,留下函數的序號 "ordinal" ,在序號前加上 "@" 符號 形成 "_導出函數名@參數字節和 @序號" 此種格式(__stdcall 方式調用導出的函數符號是 "函數名稱@參數字節和"). 最后形成.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

當然 有的函數 我沒有用的? 我就全部給了0

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

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

最后還有一句,要自動生成.h文件好象是不行的.因為dll里沒有保存函數原型,需要反匯編并分析代碼才知道每個函數的參數情況.

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);
最后函數頭添加聲明?

就可以調用了 - -!

?

相關參考:

http://blog.sina.com.cn/s/blog_4c72efa6010092m5.html

http://blog.csdn.net/tingsking18/article/details/5394466

?


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WP8手機解鎖時提示“請確保IPOVERUSBSVC服務正常運行”解決方法

如果你各種重啟服務 卸載手機 重裝驅動都試過了還不行,請看看你是否安裝了Hyper-v或Vitualbox虛擬機,很有可能是虛擬交換機造成的。 我在網絡連接屬性里看到這個 把它卸載后,解鎖成功。 解鎖后記得重新安裝卸載的那個網絡服務轉載于:https://…

Win32路徑操作相關API

一.路徑截斷與合并 PathRemoveArgs 去除路徑的參數 PathRemoveBackslash 去除路徑最后的反斜杠 "\" PathAddBackslash 在路徑最后加上反斜杠 "\" PathRemoveBlanks 去除路徑前后的空格 PathAddExtension 在文件路徑后面加上擴展名 PathRemoveExtension 去…

Openjudge-計算概論(A)-稱體重

描述: 趙、錢、孫、李四個人中既有大人也有小孩,給他們稱體重時發現,他們每個人的體重都不一樣,且體重(單位:公斤)恰好是10的整數倍,且他們的體重都不高 于50公斤,已知趙…

浮點數的存儲

-------------------------------------------------------------------------------- 在VC6.0----float環境一共32位 其中第一位是符號位 第二到第9位中間8位為小數點位置(指數以127的二進制為原點向下為負指數 向上為正指數)后面23位為數據位。 S EE…

第二階段總結

結合第二階段后3天,我們試用了UI,antionbar,menu等實用,成功的做出了字體的轉換,題目的轉化等功能。 其實四則運算,說難不難 說易不易,總結出 主要有付出,就有回報。 menu等做的過程…

const 和指針

c用了那么久,覺得 const 和指針配合到一起的時候就會有點點分不出來。 如下: const Data* pData;Data const * pDataData * const pDataconst Data * const pData Data const * const pData是不是有點暈? 我其實用得最多的是 const Data* pData, 也…

Linux 查看系統用戶的登錄日志

查看用戶登錄系統的日志有兩類日志記錄用戶登錄的行為,一是記錄登錄者的數據,一個是記錄用戶的登錄時間一,記錄用戶登錄數據/var/log/wtmp日志文件記錄用戶登錄的數據。但這個文件是被編碼的文件,不能直接用vi、cat等命令查看&…

Android -- 自定義權限

在android系統的安全模型中,應用程序在默認的情況下不可以執行任何對其他應用程序,系統或者用戶帶來負面影響的操作。如果應用需要執行某些操作,就需要聲明使用這個操作對應的權限。 (在manifest文件中 添加標記)。 ap…

Win32 路徑操作API

路徑操作相關API 路徑截斷與合并函數 PathRemoveArgs 去除路徑的參數 PathRemoveBackslash 去除路徑最后的反斜杠“\” PathAddBackslash 在路徑最后加上反斜杠“\” PathRemoveBlanks 去除路徑前后的空格 PathAddExtension 在文件路徑后面加上擴展名 Pa…

dbms_output.put_line長度限制問題

dbms_output.put_line長度限制問題對于10g以上版本(包括10g), dbms_output.put_line的最大長度限制是32767. 如果報錯buffer overflow, 執行如下語句即可:set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED對于10g以下版本dbms_output.put_line最大長度限制是255.轉載于…

js深入研究之Person類案例

<script type"text/javascript"> /* 定義一個Person類 */ function Person(name, age) {this.name name;this.age age; } /* 添加兩個方法getName getAge */ Person.prototype {getName: function() {return this.name;},getAge: function() {return this.a…

C++名稱粉碎

C name mangling 1: ?0: 構造器&#xff0c;?1 析構器 2: QAE: public __thiscall AAE: private __thiscall QBE: public __thiscall const 3: 返回值和參數類型 B&#xff1a;const D&#xff1a;char E&#xff1a;unsigned char F&#xff1a;…

一款基于css3鼠標經過圓形旋轉特效

今天給大家分享一款基于css3鼠標經過圓形旋轉特效。當鼠標經過的時候圖片邊框顏色旋轉&#xff0c;圖片顯示詳情。該實例適用瀏覽器&#xff1a;IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗。效果圖如下&#xff1a; 在線預覽 源碼下載 實現的代碼。 ht…

Delphi與Windows 7下的用戶賬戶控制(UAC)機制

WIN7/WIN8/WIN10, Vista提供的UAC機制&#xff0c;它的主要目的是防止對于操作系統本身的惡意修改。 對于Delphi程序的影響&#xff0c;UAC主要在于以下幾點&#xff1a; 1、由于UAC機制&#xff0c;Delphi對于系統的操作可能無聲的失敗&#xff0c;而同樣的程序&#xff0c;在…

[轉]深入理解Java 8 Lambda(類庫篇——Streams API,Collectors和并行)

以下內容轉自&#xff1a; 作者&#xff1a;Lucida 微博&#xff1a;peng_gong 豆瓣&#xff1a;figure9 原文鏈接&#xff1a;http://zh.lucida.me/blog/java-8-lambdas-insideout-library-features 本文謝絕轉載&#xff0c;如需轉載需征得作者本人同意&#xff0c;謝謝。 --…

Eclipse生成jar包

前言: 本宅因為要寫XXX軟件的一個插件,來用用java,接觸3天后 在打jar包上卡住了..... 經過大量的百度搜索后有如下幾種解決方案: 解決方案: 一.安裝Fatjar 在線安裝地址:http://kurucz-grafika.de/fatjar 悲劇的是我怎么也安裝不上去,于是放棄(在線下載包什么 我的Eclipse版…

Buffer和Cache的區別

現在不都是只有page cache了嗎&#xff1f; buffer pages其實也是page cache里面的頁。只是多了一層抽象&#xff0c;通過buffer_head來進行一些訪問管理對,從Linux算法實現的角度&#xff0c;page cache和buffer cache目前是一樣的&#xff0c;但是從功能抽象和具體應用來講&a…

Android刷機

這里也有一篇比較詳細的 http://blog.csdn.net/qq1084283172/article/details/52334452 官網刷機包 https://developers.google.com/android/images#hammerhead 我的機器是Nexus 5 一. 安裝驅動 如何進入fastboot模式 1. 拔掉數據線&#xff0c;將手機關機 2. 關機后同時按…

中西醫與算法之間的聯系

中西醫的特點網上有非常多討論&#xff0c;概括起來就是西醫治病&#xff0c;中醫不治病 這個觀點有部分道理&#xff0c;但不全對 中醫落后的原因有非常多&#xff0c;但假設能用計算機的算法改進一下應該有非常大提升 比方翻譯&#xff0c;比方路線規劃&#xff0c;比方信號識…

程序的版式

版式雖然不會影響程序的功能&#xff0c;但會影響可讀性。程序的版式追求清晰、美觀&#xff0c;是程序風格的重要構成因素。可以把程序的版式比喻為“書法”。好的“書法”可讓人對程序一目了然&#xff0c;看得興致勃勃。差的程序“書法”如螃蟹爬行&#xff0c;讓人看得索然…