如何選擇DLL中函式的匯出方式

2021-06-21 21:08:53 字數 1538 閱讀 3266

要匯出dll

中的函式,我們有兩種方式:一是使用模組定義檔案(

.def

檔案);二是使用

__declspec(dllexport)

關鍵字。

那麼,應該選擇哪種方式來匯出dll

中的函式呢?要決定如何選擇,你應該首先想清楚這個問題:誰將使用你的

dll?是你自己的應用使用的

dll,還是他人的應用使用的你的

dll作為第三方

dll?

然後,你參考下面的.def

和__declspec(dllexport)

方式的優缺點及適用場合來決定如何選擇。

使用.def

檔案匯出的優點 (1

)你能控制匯出函式的名字。由於函式的不同呼叫約定所產生的函式名的

decorated name

是不同的(例如,

__stdcall, __cdecl

兩種呼叫約定),所以為了得到簡潔一致的匯出函式名,就必須使用

.def

檔案。

(2)你能控制匯出函式的序號。當你要構造乙個供他人使用的第三方

dll時,你就需要確保每次更新的

dll中的函式名和序號都與以前的版本保持一致。當你新增額外的函式到

dll中時,通過賦予新函式較大的序號,從而新的

dll不會影響使用該

dll的應用(不管它是使用函式名還是使用序號呼叫函式的)。而要做到這些,就必須使用

.def

檔案進行控制。例如,

mfc中的

dll就是使用

.def

檔案進行控制的。 (3

)還可控制匯出函式的

noname

屬性。通過指定匯出函式的

noname

屬性(exports

語句:entryname[=internalname] [@ordinal[noname]] [data] [private]

),可以在

dll的匯出表中不儲存函式名,只儲存序號,從而在有很多函式時節約很多空間。但同時也給

dll的使用者帶來了困難,因為他們只能使用序號呼叫函式。所以,

noname

屬性的使用並不多見(如果你想使你的

dll充滿神秘,就用吧)。

所以,使用.def

的優點是很顯然的,特別適用於第三方

dll的製作。

使用__declspec(dllexport)

的優點是簡單、方便,但缺點是顯而易見的,無法完成上面

.def

的工作。所以,它一般用於應用程式自己使用的

dll。這樣,即使

dll的匯出函式的

decorated name

有各種可能,應用在編譯時都可以根據

dll的

import library

找到相應的函式,從而避免了上面

.def

檔案所述的

(1)和

(2)的兩個缺點。當

dll更新後,要使用新的

dll,也需要應用重新編譯鏈結。

如何隱藏DLL的匯出函式

估計有時你不想暴露所有的匯出函式,匯出乙個類有時候更是不安全的。以下這樣做是否可以?dll中定義乙個基類 class iinte ce 匯出類從這個基類派生 driver.h class cdriver public iinte ce driver.cpp void cdriver dfun1 vo...

Dll匯出函式的兩種方式

dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dllexport 另外一種方式是 採用模組定義 def 檔案宣告,def 檔案為鏈結器提供了有關被鏈結程式的匯出 屬性及其他方面的資訊。方式一 在函式宣告中加上 declspec dllexport 在動態鏈結庫程式...

DLL中匯出函式的兩種方式

dll中匯出函式的兩種方式 dllexport與.def檔案 2009 03 06 11 34 58 標籤 dll匯出函式 兩種方式 declspec dllexport def 檔案it 分類 程式設計技術 dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dlle...