小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VC++中(.def) 文件

 talentfirst1 2010-07-19

VC++中(.def) 文件


一直沒(méi)什么問(wèn)題的工程突然出了問(wèn)題,這個(gè)原因出現(xiàn)過(guò)幾次都是糊里糊涂就過(guò)去了,今天貼出來(lái)作為技術(shù)總結(jié)吧。以下就是在C++中自建的dll定義的API,是不是應(yīng)該在.def中做一個(gè)聲明。

MSDN中的名詞解釋

模塊定義 (.def) 文件為鏈接器提供有關(guān)被鏈接程序的導(dǎo)出、屬性及其他方面的信息。生成 DLL 時(shí),.def 文件最有用。由于存在可代替模塊定義語(yǔ)句使用的鏈接器選項(xiàng),通常不需要 .def 文件。也可以將 __declspec(dllexport) 用作指定導(dǎo)出函數(shù)的手段。在鏈接器階段可以使用 /DEF(指定模塊定義文件)鏈接器選項(xiàng)調(diào)用 .def 文件。

如果生成的 .exe 文件沒(méi)有導(dǎo)出,使用 .def 文件將使輸出文件較大并降低加載速度。

通俗解釋:

在VC++中,生成DLL可以不使用.def文件。只需要在VC++的函數(shù)定義前要加__declspec(dllexport)修飾就可以了。但是使用__declspec(dllexport)和使用.def文件是有區(qū)別的。如果DLL是提供給VC++用戶(hù)使用的,你只需要把編譯DLL時(shí)產(chǎn)生的.lib提供給用戶(hù),它可以很輕松地調(diào)用你的DLL。但是如果你的DLL是供其他程序如VB、delphi,以及.NET

用戶(hù)使用的,那么會(huì)產(chǎn)生一個(gè)小麻煩。因?yàn)閂C++對(duì)于__declspec(dllexport)聲明的函數(shù)會(huì)進(jìn)行名稱(chēng)轉(zhuǎn)換,如下面的函數(shù):

    __declspec(dllexport) int __stdcall IsWinNT()

    會(huì)轉(zhuǎn)換為IsWinNT@0,這樣你在VB中必須這樣聲明:

    Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long

    @的后面的數(shù)由于參數(shù)類(lèi)型不同而可能不同。這顯然不太方便。所以如果要想避免這種轉(zhuǎn)換,就要使用.def文件方式。

    EXPORTS后面的數(shù)可以不給,系統(tǒng)會(huì)自動(dòng)分配一個(gè)數(shù)。對(duì)于VB、PB、Delphi用戶(hù),通常使用按名稱(chēng)進(jìn)行調(diào)用的方式,這個(gè)數(shù)關(guān)系不大,但是對(duì)于使用.lib鏈接的VC程序來(lái)說(shuō),不是按名稱(chēng)進(jìn)行調(diào)用,而是按照這個(gè)數(shù)進(jìn)行調(diào)用的,所以最好給出。

例子:我們用VC6.0制作一個(gè)dll,不使用.def文件,在頭文件中這樣寫(xiě)

#ifndef LIB_H

#define LIB_H

extern "C" int _declspec(dllexport)add(int x,int y);

#endif

如果是.def文件,可以這樣

LIBRARY      "xxx_dll"

EXPORTS

add  PRIVAT

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多