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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

[DLL - Beginers]使用DEF文件修復(fù)函數(shù)名——對《使用LoadLibrary調(diào)用從Dll中輸出的class》的一點補充 收藏
使用DEF文件修復(fù)函數(shù)名
——對《使用LoadLibrary調(diào)用從Dll中輸出的class》的一點補充

作者 李成竹

在《使用……》一文中,作者在“代碼”的第三點提到了“使用一個DEF文件修復(fù)了函數(shù)名”,但是并沒有講解什么是DEF文件,也沒有說明應(yīng)該如何修復(fù),可能會使某些初學(xué)者(包括我自己)感到疑惑。我也上網(wǎng)搜索了一下,講解DEF文件作用以及詳細(xì)使用方法的文章不多且比較零散,本文在此用一個簡單例子簡單闡述一下DEF文件一般的使用方法,以方便需要者查閱。

?

DEF文件的全稱是Module-Definition File,即模塊定義文件,是用來定義EXE和DLL文件的一種文件格式,以文本形式保存(可用記事本創(chuàng)建/編輯)。由于鏈接器為大多數(shù)模塊定義聲明提供了對應(yīng)的命令行選項,所以一般的Win32程序并不需要.DEF文件。但是在編寫DLL時,尤其是在編寫C++的DLL時,(由于名稱修飾)DEF文件還是有它的用武之地的。

※注:關(guān)于“名稱修飾”在很多地方都有介紹,文中不作講解。

?

DEF文件的主要內(nèi)容是由一系列的聲明(statement)組成,包括NAME、LIBRARY、DISCRIPTION、STACKSIZE、SECTIONS、EXPORTS、VERSION。

?

¨???????? NAME:指定輸出文件的文件名,設(shè)置image基址

¨???????? LIBRARY(DLL):指定DLL的內(nèi)部名稱和加載時的基址

¨???????? DISCRIPTION:文件描述

¨???????? STACKSIZE:設(shè)置棧的大小

¨???????? SECTIONS:設(shè)置image文件的一個或多個段屬性

¨???????? EXPORTS:定義輸出列表

¨???????? VERSION:指定文件版本

?

其中最常用的是LIBRARY、EXPORTS和DISCRIPTION。

?

示例

1.????? 現(xiàn)在有一個已經(jīng)編寫好的類要用DLL輸出,并通過函數(shù)名對DLL進行動態(tài)調(diào)用。其頭文件和源文件如下:

Header File:

#ifdef LIBDLL_EXPORTS
#define LIBDLL_API __declspec(dllexport)
#else
#define LIBDLL_API __declspec(dllimport)
#endif

#include <iostream.h>

// This class is exported from the LibDll.dll
class LIBDLL_API CTest
{
? int data;

public:
? CTest();
? void print();
};

Source File:

#include "stdafx.h"
#include "LibDll.h"

BOOL APIENTRY DllMain( HANDLE hModule,
?????????????????????? DWORD? ul_reason_for_call,
?????????????????????? LPVOID lpReserved
???????????????????????????????? )
{
??? switch (ul_reason_for_call)
? {
???????? case DLL_PROCESS_ATTACH:
???????? case DLL_THREAD_ATTACH:
???????? case DLL_THREAD_DETACH:
???????? case DLL_PROCESS_DETACH:
???????????????? break;
??? }
??? return TRUE;
}

CTest::CTest()
{
? this->data = 0;
}

void CTest::print()
{
? cout<<"The member function print() is from a DLL.\n";
}


從代碼中可以看到,DLL中定義了一個CTest類,它有一個構(gòu)造函數(shù)和一個成員函數(shù)print()。

2.????? 然后新建一個Win32 Console Application來調(diào)用DLL。

Header File:

#define LIBDLL_API __declspec(dllimport)

#include <iostream.h>

// This class is exported from the LibDll.dll
class LIBDLL_API CTest
{
? int data;

public:
? CTest();
? void print();
};

Source File:

#include "stdafx.h"
#include <iostream.h>
#include <malloc.h>
#include <windows.h>
#include "LibDll.h"

typedef void (WINAPI *PCTOR)();
typedef void (*PPRINT)();

inline void CTest_print(HMODULE, CTest*);
inline void CTest_CTest(HMODULE, CTest*);

int main(int argc, char* argv[])
{
? //加載DLL
? HMODULE hmod = LoadLibrary("LibDll.dll");
? if(hmod == NULL)
? {
???????? cout<<"Failed loading DLL.\n";

???????? return 1;
? }

? //創(chuàng)建類對象
? CTest* pCTest = (CTest*)malloc(sizeof(CTest));

? //初始化CTest對象
? CTest_CTest(hmod, pCTest);
????????
?//調(diào)用成員函數(shù)
? CTest_print(hmod, pCTest);

? FreeLibrary(hmod);
? free(pCTest);

? cout<<"Press [Enter] to exit.";
? cin.peek();

? return 0;
}//end main


void CTest_print(HMODULE hMod, CTest* pObj)
{
? PPRINT pprint = (PPRINT)GetProcAddress(hMod, "print");
? if(pprint == NULL)
? {
???????? cout<<"Function print() not found.\n";
? }
? else
? {
???????? __asm{ MOV ECX, pObj}

???????? pprint();
? }
}

void CTest_CTest(HMODULE hMod, CTest* pObj)
{
? PCTOR pCtor = (PCTOR)GetProcAddress(hMod, "CTest");
? if(pCtor == NULL)
? {
???????? cout<<"Function CTest() not found.\n";
? }
? else
? {
???????? __asm{ MOV ECX, pObj}

???????? pCtor();
? }
}

?

本來到這里就應(yīng)該可以正常運行了,但是你會發(fā)現(xiàn)在執(zhí)行CTest_CTest函數(shù)時會提示"Function CTest() not found."。為什么會找不到函數(shù)呢?那是因為C++編譯器在生成DLL時對輸出函數(shù)的名稱進行來“修飾”,所以DLL中的函數(shù)名稱已經(jīng)不再是我們在代碼中所寫的函數(shù)名,這個時候就需要用DEF文件來進行“函數(shù)名稱修復(fù)”。

3.????? 用Dumpbin的/EXPORTS參數(shù)打開LibDll.Dll,截圖如下:

?

其中1和3就是CTest類的構(gòu)造函數(shù)和print()函數(shù)的實際名稱(嚇人吧……)。然后我們在DLL的工程目錄中新建一個“LibDll.def”文件,并在“工程->設(shè)置->Link”中添加參數(shù)(/def:".\libdll.def"),并編

輯DEF文件內(nèi)容如下:


LIBRARY LibDll
EXPORTS
?CTest?? = ??0CTest@@QAE@XZ
?print?? = ?print@CTest@@QAEXXZ


相信你已經(jīng)看出來了,這實際上是一個函數(shù)名映射。

再用Dumpbin打重新編譯得到的DLL文件,截圖如下:


圖中的4和5就是修復(fù)后的函數(shù)名。

現(xiàn)在再運行第二步中的程序就可以成功地調(diào)用DLL里的函數(shù)了!

尾注


文中只使用了DEF文件的一小部分功能,詳細(xì)資料請參見MSDN。

按照MSDN上的說法,有三種方法可以用來輸出函數(shù),按推薦順序如下:

在源代碼中使用__declspec(dllexport)關(guān)鍵字(調(diào)用工程需包含*.lib)
使用DEF文件中的EXPORTS聲明(不需要*.lib,可實現(xiàn)動態(tài)調(diào)用)
在LINK命令中使用/EXPORT參數(shù)(效果和DEF文件相同)
具體應(yīng)該使用哪種方法,還應(yīng)該視用途由使用者自己決定。

?

作者水平有限,文中難免不當(dāng)之處,歡迎大家指出和批評。


本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/jdcb2001/archive/2006/11/21/1401569.aspx

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美中日韩免费视频| 亚洲日韩欧美视频一区| 欧美亚洲三区| 亚洲视频 欧洲视频| 亚洲精品久久视频| 国产女优一区| 国产精品一卡二| 国产毛片久久| 在线精品高清中文字幕| 亚洲人成网站在线观看播放| 一区二区福利| 亚洲一区成人| 欧美尤物一区| 欧美第一黄色网| 亚洲精品永久免费| 亚洲专区一二三| 欧美尤物巨大精品爽| 久久成人综合视频| 欧美成人精品h版在线观看| 亚洲国产国产亚洲一二三| 亚洲美女精品久久| 亚洲女ⅴideoshd黑人| 久久中文精品| 国产精品白丝av嫩草影院| 国户精品久久久久久久久久久不卡| 一区二区三区无毛| 亚洲一区日韩在线| 欧美韩国一区| 亚洲欧美日韩在线不卡| 欧美mv日韩mv国产网站app| 欧美精品一区二区三区在线播放| 国产区日韩欧美| 亚洲精品欧洲| 久久综合五月| 午夜老司机精品| 欧美日韩午夜剧场| 在线观看国产精品淫| 中文在线资源观看视频网站免费不卡| 久久久久国产精品人| 日韩视频在线你懂得| 久久人体大胆视频| 国产欧美日韩不卡免费| 中国成人在线视频| 亚洲高清视频的网址| 久久精品观看| 国产一区二区三区四区五区美女| 亚洲制服av| 激情成人中文字幕| 亚洲免费视频成人| 亚洲精品中文字幕在线| 免费观看在线综合色| 狠狠色伊人亚洲综合成人| 欧美专区日韩视频| 亚洲视频免费观看| 欧美色综合网| 在线视频欧美日韩| 亚洲精品视频啊美女在线直播| 久久久国产成人精品| 国产亚洲aⅴaaaaaa毛片| 亚洲私人影吧| 亚洲精品视频一区| 欧美激情亚洲视频| 在线成人黄色| 亚洲电影在线| 久久亚洲综合色| 久久久久久一区二区| 伊人色综合久久天天| 久久久久久穴| 亚洲欧美激情视频在线观看一区二区三区 | 国产农村妇女毛片精品久久莱园子 | 今天的高清视频免费播放成人 | 久久国产精品99精品国产| 国产精品推荐精品| 亚洲欧美日韩人成在线播放| 一道本一区二区| 国产精品久久久久免费a∨| 亚洲欧美国产精品桃花| 香蕉久久一区二区不卡无毒影院 | 一区二区三区鲁丝不卡| 一区二区视频欧美| 欧美成熟视频| 欧美激情视频在线播放| 在线视频欧美精品| 午夜国产精品视频| 在线精品视频一区二区| 亚洲欧洲日产国码二区| 欧美三级精品| 久久九九99| 欧美成人午夜免费视在线看片| 日韩一级裸体免费视频| 亚洲一区二区三区精品动漫| 国内精品视频在线播放| 亚洲国产91| 国产精品海角社区在线观看| 久久国产一区二区| 免播放器亚洲一区| 亚洲一区二区三区乱码aⅴ| 午夜精品一区二区三区在线播放| 禁久久精品乱码| av72成人在线| 狠狠色狠色综合曰曰| 在线亚洲电影| 亚洲国产成人精品久久| 亚洲一区二区三区四区五区黄| 伊人男人综合视频网| 亚洲桃花岛网站| 亚洲激情第一区| 欧美一区二区国产| 一区二区欧美在线观看| 欧美一区二区三区久久精品茉莉花| 午夜免费日韩视频| 亚洲九九精品| 久久精品人人爽| 亚洲一区精品视频| 欧美精品不卡| 亚洲高清久久| 亚洲综合电影| 亚洲午夜极品| 欧美精品一区二区三区蜜臀 | 亚洲国产视频直播| 欧美一区日韩一区| 午夜在线播放视频欧美| 欧美日韩国产免费| 亚洲国产中文字幕在线观看| 激情六月综合| 欧美一级成年大片在线观看| 亚洲欧洲av一区二区| 欧美午夜不卡视频| 99精品欧美一区| 一区二区电影免费在线观看| 欧美精品一区视频| 欧美激情网友自拍| 影音先锋在线一区| 久久免费精品视频| 美日韩精品免费| 国产亚洲精品久久久久婷婷瑜伽 | 亚洲免费高清| 欧美国产激情| 亚洲欧洲一区二区在线播放| 亚洲人成在线影院| 欧美国产日本高清在线| 美日韩精品视频免费看| 激情自拍一区| 久久99伊人| 国产精品二区在线| 亚洲三级视频| 一区二区欧美在线| 国产精品xnxxcom| 亚洲视频一区在线| 欧美一级淫片aaaaaaa视频| 国产精品视频不卡| 欧美亚洲视频在线观看| 久久久久久午夜| 精品成人一区二区| 久久精品五月| 女生裸体视频一区二区三区| 亚洲欧洲日产国产综合网| 欧美日韩国产不卡在线看| 9l视频自拍蝌蚪9l视频成人| 亚洲男人av电影| 国语自产在线不卡| 久久阴道视频| 日韩亚洲国产欧美| 久久av一区| 亚洲国产日韩欧美在线99| 欧美日本二区| 亚洲欧美成人一区二区三区| 乱码第一页成人| 亚洲国产高清自拍| 欧美日韩在线免费视频| 欧美一区二区三区免费大片| 欧美激情按摩| 羞羞漫画18久久大片| 亚洲国产精品一区在线观看不卡 | 欧美日一区二区三区在线观看国产免| 亚洲视频精品| 欧美激情视频一区二区三区在线播放 | 亚洲伊人一本大道中文字幕| 国产麻豆日韩| 久久久青草婷婷精品综合日韩| 欧美激情精品久久久| 亚洲图片在区色| 影音先锋久久久| 欧美午夜欧美| 美女久久网站| 午夜欧美视频| 一本大道av伊人久久综合| 免费成人av在线看| 欧美一区二区三区在线观看| 最新国产成人av网站网址麻豆 | 亚洲国产专区校园欧美| 久久久91精品国产一区二区三区| av成人毛片| 亚洲福利视频一区| 国产乱码精品1区2区3区| 欧美另类高清视频在线| 久久一区二区精品| 欧美在线播放一区| 亚洲欧美日韩成人| 在线视频精品一|