青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

yehao's Blog

DLL編程總結(jié)

1)創(chuàng)建DLL

創(chuàng)建DLL的時(shí)候,頭文件里在輸出變量,函數(shù),類(lèi)之前使用__declspec(dllexport)修飾符號(hào)。當(dāng)VC編譯器看到變量,函數(shù)或者類(lèi)之前的這個(gè)修改符的時(shí)候,它就將某些附加信息嵌入產(chǎn)生的.obj文件中。當(dāng)鏈接DLL的所有.obj文件時(shí),鏈接程序要查找關(guān)于輸出變量,函數(shù)或類(lèi)的信息,并自動(dòng)生成一個(gè).lib文件,它包含一個(gè)DLL輸出的符號(hào)列表。如果要鏈接引用該DLL的輸出符號(hào)的任何可執(zhí)行模塊,該.lib文件是必不可少的。(DLL工程需要定義MYMATHLIB_EXPORTS宏)

MyMathLib.h

  1. #ifdef MYMATHLIB_EXPORTS   
  2. #define MYMATHLIB_API __declspec(dllexport)   
  3. #else   
  4. #define MYMATHLIB_API __declspec(dllimport)   
  5. #endif   
  6.   
  7. int MYMATHLIB_API Add(int lhs, int rhs);  


MyMathLib.cpp

  1. #include "MyMathLib.h"   
  2.   
  3. int MYMATHLIB_API Add(int lhs, int rhs)  
  4. {  
  5.     return lhs + rhs;  
  6. }  


除了創(chuàng)建.lib文件外,鏈接程序還要將一個(gè)輸出符號(hào)表嵌入產(chǎn)生的DLL文件。可以使用dumpbin程序察看dll的輸出節(jié)。

  1. >dumpbin -exports MyMathLib.dll  
  2. Microsoft (R) COFF/PE Dumper Version 10.00.30319.01  
  3. Copyright (C) Microsoft Corporation. All rights reserved.  
  4.   
  5.   
  6. Dump of file MyMathLib.dll  
  7.   
  8. File Type: DLL  
  9.   
  10. Section contains the following exports for MyMathLib.dll  
  11.   
  12. 00000000 characteristics  
  13. 4E258F37 time date stamp Tue Jul 19 22:05:43 2011  
  14. 0.00 version  
  15. 1 ordinal base  
  16. 1 number of functions  
  17. 1 number of names  
  18.   
  19. ordinal hint RVA name  
  20.   
  21. 1 0 0001106E ?Add@@YAHHH@Z = @ILT+105(?Add@@YAHHH@Z)  
  22.   
  23. Summary  
  24.   
  25. 1000 .data  
  26. 1000 .idata  
  27. 2000 .rdata  
  28. 1000 .reloc  
  29. 1000 .rsrc  
  30. 4000 .text  
  31. 10000 .textbss  


2)創(chuàng)建可執(zhí)行模塊

可執(zhí)行模塊引用DLL的頭文件,使用__declspec(dllimport)符號(hào)進(jìn)行定義。當(dāng)編器看到修改變量,函數(shù)或類(lèi)的__declspec(dllimport)時(shí),它知道這個(gè)符號(hào)是從某個(gè)DLL模
塊輸入的。創(chuàng)建產(chǎn)生的可執(zhí)行模塊的鏈接程序必須確定哪些DLL包含代碼引用的所有輸入符號(hào)。因此你必須將DLL的.lib文件傳遞給鏈接程序。

實(shí)際上,當(dāng)輸入一個(gè)符號(hào)時(shí),不必使用關(guān)鍵字__declspec(dllimport),只要使用標(biāo)準(zhǔn)的C關(guān)鍵字extern即可。但是如果編譯器預(yù)先知道你引用的符號(hào)將從一個(gè)DLL的.lib文件輸入,那么編譯器就能夠生成運(yùn)行效率稍高的代碼。因此建議你盡量將__declspec(dllimport)關(guān)鍵字用于輸入函數(shù)和符號(hào)。

MyEXE.cpp

  1. #include <iostream>   
  2. #include "MyMathLib.h"   
  3.   
  4. #pragma comment(lib, "MyMathLib.lib")    
  5.   
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     int ret = Add(1, 2);  
  9.     std::cout << ret << std::endl;  
  10.     return 0;  
  11. }  


當(dāng)鏈接程序進(jìn)行輸入符號(hào)的轉(zhuǎn)換時(shí),它就將一個(gè)稱(chēng)為輸入節(jié)的特殊的節(jié)嵌入產(chǎn)生的可執(zhí)行模塊。輸入節(jié)列出了該模塊需要的DLL模塊以及由每個(gè)DLL模塊引用的符號(hào)。
可以使用dumpbin程序察看模塊的輸入節(jié)。

  1. Dump of file MyEXE.exe  
  2.   
  3. File Type: EXECUTABLE IMAGE  
  4.   
  5.   Section contains the following imports:  
  6.   
  7.     MSVCP100D.dll  
  8.                 ......  
  9.     MyMathLib.dll  
  10.                 4183BC Import Address Table  
  11.                 4181F8 Import Name Table  
  12.                      0 time date stamp  
  13.                      0 Index of first forwarder reference  
  14.   
  15.                     0 ?Add@@YAHHH@Z  
  16.   
  17.     MSVCR100D.dll  
  18.                 ......  
  19.     KERNEL32.dll  
  20.                 ......  


3)調(diào)用約定

__stdcall
Pascal方式清理C方式壓棧,通常用于Win32 Api中,.參數(shù)從右向左壓入堆棧,.函數(shù)被調(diào)用者自己在退出時(shí)清空堆棧。

__cdecl
C調(diào)用約定The C default calling convention)按從右至左的順序壓參數(shù)入棧,由調(diào)用者把參數(shù)彈出棧。對(duì)于傳送參數(shù)的內(nèi)存棧是由調(diào)用者來(lái)維護(hù)的(正因?yàn)槿绱耍瑢?shí)現(xiàn)可變參數(shù)vararg的函數(shù)(如printf)只能使用該調(diào)用約定)。它是C和C++程序的缺省調(diào)用方式。每一個(gè)調(diào)用它的函數(shù)都包含清空堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會(huì)比調(diào)用__stdcall函數(shù)的大。

C編譯時(shí)函數(shù)名修飾約定規(guī)則:
__stdcall調(diào)用約定在輸出函數(shù)名前加上一個(gè)下劃線前綴,后面加上一個(gè)“@”符號(hào)和其參數(shù)的字節(jié)數(shù),格式為_(kāi)functionname@number。
__cdecl調(diào)用約定僅在輸出函數(shù)名前加上一個(gè)下劃線前綴,格式為_(kāi)functionname。

C++編譯時(shí)函數(shù)名修飾約定規(guī)則:
__stdcall調(diào)用約定:
  1、以“?”標(biāo)識(shí)函數(shù)名的開(kāi)始,后跟函數(shù)名;
  2、函數(shù)名后面以“@@YG”標(biāo)識(shí)參數(shù)表的開(kāi)始,后跟參數(shù)表;
  3、參數(shù)表以代號(hào)表示:
  X--void ,D--char,E--unsigned char,F(xiàn)--short,H--int,I--unsigned int,J--long,K--unsigned long,M--float,N--double,_N--bool,....
  PA--表示指針,后面的代號(hào)表明指針類(lèi)型,如果相同類(lèi)型的指針連續(xù)出現(xiàn),以“0”代替,一個(gè)“0”代表一次重復(fù);
  4、參數(shù)表的第一項(xiàng)為該函數(shù)的返回值類(lèi)型,其后依次為參數(shù)的數(shù)據(jù)類(lèi)型,指針標(biāo)識(shí)在其所指數(shù)據(jù)類(lèi)型前;
  5、參數(shù)表后以“@Z”標(biāo)識(shí)整個(gè)名字的結(jié)束,如果該函數(shù)無(wú)參數(shù),則以“Z”標(biāo)識(shí)結(jié)束。
  其格式為“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,
__cdecl調(diào)用約定:規(guī)則同上面的_stdcall調(diào)用約定,只是參數(shù)表的開(kāi)始標(biāo)識(shí)由上面的“@@YG”變?yōu)?a href="mailto:“@@YA">“@@YA”。

例如int Add(int lhs, int rhs) =〉 ?Add@@YAHHH@Z

 

可以使用extern "C" 防止VC編譯器修改函數(shù)名字。

  1. #ifdef  __cplusplus   
  2. extern "C" {  
  3. #endif   
  4. int MYMATHLIB_API Add(int lhs, int rhs);  
  5. #ifdef  __cplusplus   
  6. }  
  7. #endif  

重新生成MyMathLib.dll后,使用dumpbin察看輸出節(jié):

  1. ordinal hint RVA      name  
  2.   
  3.       1    0 000110AF Add = @ILT+170(_Add)  

 

如果加上__stdcall修飾符,

  1. #ifdef MYMATHLIB_EXPORTS   
  2. #define MYMATHLIB_API  __declspec(dllexport) __stdcall   
  3. #else   
  4. #define MYMATHLIB_API  __declspec(dllimport) __stdcall   
  5. #endif   
  6.   
  7.   
  8. #ifdef  __cplusplus   
  9. extern "C" {  
  10. #endif   
  11. int MYMATHLIB_API Add(int lhs, int rhs);  
  12. #ifdef  __cplusplus   
  13. }  
  14. #endif  

重新生成MyMathLib.dll后,使用dumpbin察看輸出節(jié):

  1. ordinal hint RVA      name  
  2.   
  3.       1    0 00011087 _Add@8 = @ILT+130(_Add@8)  

 

一般使用extern "C" 實(shí)現(xiàn)C++與C及其它語(yǔ)言的混合編程。
如果在C++中引用C語(yǔ)言中的函數(shù)和變量,在包含C語(yǔ)言頭文件時(shí),或者C++調(diào)用一個(gè)C語(yǔ)言編寫(xiě)的.DLL時(shí),當(dāng)包括.DLL的頭文件或聲明接口函數(shù)時(shí),應(yīng)加extern "C" { }。
在C中引用C++語(yǔ)言中的函數(shù)和變量時(shí),比如回調(diào)函數(shù),C++的頭文件需添加extern "C"。

4).def文件

模塊定義 (.def) 文件是包含一個(gè)或多個(gè)描述 DLL 各種屬性的 Module 語(yǔ)句的文本文件。如果不使用 __declspec(dllexport) 關(guān)鍵字導(dǎo)出 DLL 的函數(shù),則 DLL 需要 .def 文件。
.def 文件必須至少包含下列模塊定義語(yǔ)句:
文件中的第一個(gè)語(yǔ)句必須是 LIBRARY 語(yǔ)句。此語(yǔ)句將 .def 文件標(biāo)識(shí)為屬于 DLL。LIBRARY 語(yǔ)句的后面是 DLL 的名稱(chēng)。鏈接器將此名稱(chēng)放到 DLL 的導(dǎo)入庫(kù)中。
EXPORTS 語(yǔ)句列出名稱(chēng),可能的話還會(huì)列出 DLL 導(dǎo)出函數(shù)的序號(hào)值。通過(guò)在函數(shù)名的后面加上 @ 符和一個(gè)數(shù)字,給函數(shù)分配序號(hào)值。

MyMathLib.h

  1. int Add(int lhs, int rhs);  

MyMathLib.cpp

  1. #include "MyMathLib.h"   
  2.   
  3. int Add(int lhs, int rhs)  
  4. {  
  5.     return lhs + rhs;  
  6. }  

MyMathLib.def

  1. LIBRARY MyMathLib  
  2. EXPORTS  
  3.     Add     @100  

重新生成MyMathLib.dll后,使用dumpbin察看輸出節(jié):

  1. ordinal hint RVA      name  
  2.   
  3.     100    0 0001106E Add = @ILT+105(?Add@@YAHHH@Z)  

當(dāng)生成 DLL 時(shí),鏈接器使用 .def 文件創(chuàng)建導(dǎo)出 (.exp) 文件和導(dǎo)入庫(kù) (.lib) 文件。然后,鏈接器使用導(dǎo)出文件生成 DLL 文件。隱式鏈接到 DLL 的可執(zhí)行文件在生成時(shí)鏈接到導(dǎo)入庫(kù)。可以使用dumpbin程序察看可執(zhí)行文件的輸入節(jié)。可以看到現(xiàn)在是按序號(hào)進(jìn)行連接了。

  1. MyMathLib.dll  
  2.             4183BC Import Address Table  
  3.             4181F8 Import Name Table  
  4.                  0 time date stamp  
  5.                  0 Index of first forwarder reference  
  6.   
  7.                   Ordinal   100  


http://blog.csdn.net/fw0124/article/details/6618405

posted on 2011-09-26 19:06 厚積薄發(fā) 閱讀(275) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Windows編程

導(dǎo)航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆分類(lèi)

文章分類(lèi)

文章檔案

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲另类一区二区| 亚洲国产成人porn| 亚洲在线播放| 一区二区国产精品| 欧美视频亚洲视频| 午夜精品视频一区| 亚洲欧美色婷婷| 国产一区二区三区奇米久涩 | 好吊一区二区三区| 欧美成人一区二区三区在线观看| 久久婷婷亚洲| 亚洲美女电影在线| 一区二区欧美国产| 国产日产高清欧美一区二区三区| 久久精品一区蜜桃臀影院| 久久久久久国产精品一区| 亚洲精品一品区二品区三品区| 亚洲人成网在线播放| 欧美精品激情在线观看| 亚洲字幕在线观看| 久久精品亚洲热| 一本一本久久| 欧美制服丝袜| 一本色道久久综合狠狠躁篇的优点 | 国产亚洲精品高潮| 亚洲国产第一页| 国产精品久久久久久久久久直播| 久久精品伊人| 欧美乱大交xxxxx| 久久婷婷麻豆| 欧美偷拍另类| 欧美电影专区| 国产视频一区在线| 亚洲九九精品| 亚洲福利久久| 午夜精品美女久久久久av福利| 亚洲精品美女在线| 性色一区二区| 亚洲一区二区三区免费在线观看| 久久久91精品国产| 亚洲欧美电影在线观看| 欧美不卡在线| 六月婷婷一区| 国产三级欧美三级| 国产精品99久久久久久人| 永久域名在线精品| 亚洲欧美日韩国产成人精品影院 | 免费久久99精品国产| 99在线热播精品免费| 久久久99国产精品免费| 亚洲欧美www| 欧美日韩国产三级| 亚洲国产精品t66y| 亚洲第一网站免费视频| 性欧美长视频| 久久成人一区| 国产美女高潮久久白浆| 亚洲无亚洲人成网站77777| 一二三区精品福利视频| 欧美91大片| 欧美激情视频网站| 亚洲丰满在线| 免费成年人欧美视频| 久久―日本道色综合久久| 国产精品综合网站| 午夜精品久久久久久久99水蜜桃 | 欧美激情久久久| 亚洲大胆人体在线| 久久亚洲综合| 亚洲成人直播| 日韩一级精品| 欧美日韩亚洲另类| 99伊人成综合| 午夜免费电影一区在线观看| 国产精品扒开腿做爽爽爽视频| aa亚洲婷婷| 欧美一区二区大片| 国产亚洲va综合人人澡精品| 欧美一区二区三区四区在线| 久久综合中文色婷婷| 亚洲成人在线视频播放| 免费影视亚洲| 亚洲日本精品国产第一区| 在线亚洲精品| 国产欧美一区二区三区视频 | 亚洲美洲欧洲综合国产一区| 亚洲影院在线观看| 国产日韩欧美视频在线| 久久久久久穴| 亚洲三级电影在线观看| 亚洲小少妇裸体bbw| 国产精品一区二区三区久久久| 欧美亚洲系列| 亚洲国产女人aaa毛片在线| 亚洲一区日韩| 激情久久婷婷| 欧美日韩一区二区三区四区五区 | 日韩午夜电影| 久久精品视频亚洲| 亚洲精品一品区二品区三品区| 国产精品白丝jk黑袜喷水| 久久久夜夜夜| 99国内精品久久久久久久软件| 欧美与黑人午夜性猛交久久久| 狠狠色狠狠色综合人人| 欧美日韩国产小视频| 欧美一级在线亚洲天堂| 亚洲精品国产系列| 亚洲日本视频| 一区二区免费在线播放| 国产欧美一区二区三区在线看蜜臀| 久久久综合网站| 亚洲视频一二区| 亚洲电影成人| 久久国产精品一区二区三区四区| 亚洲精品美女久久7777777| 国产欧美 在线欧美| 欧美激情精品久久久久久大尺度 | av成人免费| 欧美激情视频免费观看| 久久香蕉精品| 性色av一区二区三区红粉影视| 亚洲精品国产精品国自产观看 | 欧美顶级少妇做爰| 久久久久国产精品厨房| 亚洲女爱视频在线| 一区二区三区不卡视频在线观看| 欧美成人午夜激情视频| 久久免费视频这里只有精品| 亚洲欧美综合v| 亚洲午夜久久久久久久久电影网| 亚洲国产一区二区三区在线播| 国产视频在线观看一区二区三区 | 美日韩精品视频| 久久精品一本| 久久福利毛片| 欧美专区在线| 欧美在线关看| 久久精品最新地址| 久久精品在线免费观看| 欧美一区二区成人| 欧美一区二区三区日韩视频| 亚洲欧美一区二区视频| 亚洲欧美偷拍卡通变态| 亚洲一区在线直播| 亚洲小说欧美另类社区| 亚洲一区二区视频| 亚洲宅男天堂在线观看无病毒| 国产精品99久久久久久有的能看| av成人免费| 亚洲一区尤物| 欧美一区亚洲| 久久一区亚洲| 欧美成人中文字幕在线| 欧美精品在线免费| 欧美色中文字幕| 国产精品爽爽ⅴa在线观看| 国产伦精品一区二区三区视频孕妇 | 久久久噜噜噜久久久| 久久人人爽人人爽爽久久| 久久先锋影音av| 欧美99久久| 欧美日韩免费观看一区=区三区| 欧美日韩一区二区视频在线| 国产精品视频一二三| 国产亚洲欧美另类中文| 在线观看中文字幕亚洲| 亚洲精品在线观| 亚洲尤物在线| 久久只精品国产| 91久久国产综合久久91精品网站| 亚洲精品一二三区| 香蕉久久国产| 久久久久综合网| 欧美日韩亚洲不卡| 黄色精品在线看| 日韩亚洲视频在线| 久久福利毛片| 午夜精品婷婷| 国产欧美综合在线| 亚洲国产欧美不卡在线观看| 亚洲美女精品一区| 欧美一区二区三区另类| 欧美激情亚洲激情| 亚洲综合电影| 欧美成在线观看| 国产亚洲一区二区三区在线观看| 亚洲国语精品自产拍在线观看| 中文在线资源观看网站视频免费不卡 | 性做久久久久久| 欧美激情亚洲激情| 午夜精品国产更新| 欧美日韩另类在线| 亚洲电影免费在线观看| 小黄鸭精品aⅴ导航网站入口| 亚洲高清精品中出| 久久电影一区| 国产精品制服诱惑| 一区二区三区欧美日韩| 欧美国产精品人人做人人爱|