extern "C" __declspec(dllexport)
一、__declspec(dllexport):
將一個函式聲名為匯出函式,就是說這個函式要被其他程式呼叫,即作為DLL的一個對外函式介面。
通常它和extern "C" 合用,形式如下:
extern "C"
{
__declspec(dllexport) RETURN_TYPE FUNCTION()
{
}
}
這是由於在製作DLL匯出函式時由於C++存在函式過載,因此__declspec(dllexport) FUNCTION(int,int) 在DLL會被decorate,例如被decorate成為 function_int_int,而且不同的編譯器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址時的不便,使用extern "C"時,上述的decorate不會發生,因為C沒有函式過載,如此一來被extern"C"修飾的函式,就不具備過載能力。
二、以下內容摘自MSDN:
“在 32 位編譯器版本中,可以使用__declspec(dllexport) 關鍵字從 DLL 匯出資料、函式、類或類成員函式。__declspec(dllexport)將匯出指令新增到物件檔案(即obj檔案),若要匯出函式,__declspec(dllexport)關鍵字必須出現在呼叫約定關鍵字的左邊(如果指定了關鍵字)。例如:
__declspec(dllexport) void __cdecl Function1(void);
若要匯出類中的所有公共資料成員和成員函式,關鍵字必須出現在類名的左邊,如下所示:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
生成 DLL 時,通常建立一個包含正在匯出的函式原型和/或類的標頭檔案,並將__declspec(dllexport)新增到標頭檔案中的宣告。
若要提高程式碼的可讀性,請為__declspec(dllexport)定義一個巨集並對正在匯出的每個符號使用該巨集:
#define DllExport __declspec( dllexport ) ”
三、__declspec(dllexport) 與 .def
模組定義 (.def) 檔案是包含一個或多個描述各種 DLL 屬性的 Module 語句的文字檔案。
1、二者的目的都是將公共符號匯入到應用程式中或從 DLL 匯出函式。
2、新增 __declspec(dllexport)是為了提供不使用.def檔案從 .EXE 或 .DLL 匯出函式的簡單方法。
3、如果不使用 __declspec (dllimport) 或 __declspec(dllexport) 匯出 DLL 函式,則 DLL 需要.def檔案。
4、並不是任何時候選擇新增 __declspec(dllexport)而放棄.def的方式都是好的。如果DLL是提供給VC++使用者使用的,只需要把編譯DLL時產生的.lib提供給使用者,它可以很輕鬆地呼叫你的DLL。但是如果DLL是供VB、PB、Delphi使用者使用的,那麼會產生一個小麻煩。因為VC++對於__declspec(dllexport) 宣告的函式會進行名稱轉換,如下面的函式:
__declspec(dllexport) int __stdcall IsWinNT()
會轉換為IsWinNT@0,這樣你在VB中必須這樣宣告:
Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long
@的後面的數由於引數型別不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式。
相關文章
- __declspec(dllexport)和__declspec(dllimport)ExportImport
- 理解 __declspec(dllexport)和__declspec(dllimport)ExportImport
- dll的def檔案與__declspec(dllexport)匯出函式方式比較Export函式
- extern c 解析
- extern "c" 用法解析
- extern "c"的用法
- C語言:extern用法C語言
- extern "C"的用法解析
- C語言extern用法C語言
- C語言中extern的用法C語言
- C++中extern的使用C++
- c語言extern的用法C語言
- C語言外部變數externC語言變數
- C/C++中extern關鍵字詳解C++
- c#之tcbs extern修飾符C#
- __declspec(dllimport)的作用Import
- C++中extern “C”含義深層探索 (轉載)C++
- extern "C"的用途—在C++程式碼中嵌入C程式碼C++C程式
- _declspec(naked) 使用(裸函式)函式
- C中的auto、static、register、extern、const和volitate
- extern用法詳解
- extern作用詳解
- 嵌入式開發程式碼中的extern "C" {的作用
- c++基礎知識(八)C/C++中修飾符const、extern、static、volatile的用法C++
- static 和extern的區別
- const,static,extern簡介
- extern、 const、static的理解
- C++關鍵字(static/register/atuo/extern/volatile/const)釋疑 (轉)C++
- 在c++程式中呼叫被C編譯器編譯後的函式,為什麼要使用extern “C”C++編譯函式
- 關於在VC++中使用 extern C遇到的stdafx.h的問題C++
- iOS之const,static,extern使用iOS
- extern int a 和int a的區別
- 巨集,static、const 、extern簡介
- C++共享之道:用extern實現原始檔變數與類成員函式的巧妙共享C++變數函式
- iOS常用關鍵字static、const、extern、defineiOS
- iOS中的static const extern關鍵字iOS
- 介紹下extern和標頭檔案的聯絡
- 值得注意的: c++動態庫、靜態庫、弱符號__attribute__((weak))以及extern之間的關係C++符號