1. 程式人生 > >extern "C" __declspec(dllexport)

extern "C" __declspec(dllexport)

模組定義 (.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() 
     會轉換為
[email protected]
,這樣你在VB中必須這樣宣告: 
     Declare Function IsWinNT Lib "my.dll" Alias "[email protected]" () As Long 
     @的後面的數由於引數型別不同而可能不同。這顯然不太方便。所以如果要想避免這種轉換,就要使用.def檔案方式。

相關推薦

DLL進一步講解:extern C & __declspec(dllexport)

模組定義 (.def) 檔案是包含一個或多個描述各種 DLL 屬性的 Module 語句的文字檔案。 1、二者的目的都是將公共符號匯入到應用程式中或從 DLL 匯出函式。 2、新增 __declspec(dllexport)是為了提供不使用.def檔案從 .EXE 或 .DLL 匯出函式的簡單方法。 3、如果

extern "C" __declspec(dllexport)

模組定義 (.def) 檔案是包含一個或多個描述各種 DLL 屬性的 Module 語句的文字檔案。 1、二者的目的都是將公共符號匯入到應用程式中或從 DLL 匯出函式。 2、新增 __declspec(dllexport)是為了提供不使用.def檔案從 .EXE 或 .DLL 匯出函式的簡單方法。 3、如果

extern "C" __declspec(dllexport) 用法

declspec(dllexport)和使用.def檔案是有區別的。如果DLL是提供給VC++使用者使用的,你只需要把編譯DLL時產生的.lib提供給使用者,它可以很輕鬆地呼叫你的DLL。但是如果你的DLL是供其他程式如VB、delphi,以及.NET使用者使用的,那麼會

動態庫匯出宣告 : extern "C" __declspec(dllexport) 與 __declspec(dllexport)

最近在做專案,在動態載入動態庫後,使用GetProcAddress( HMODULE hModule, LPCWSTR lpProcName)獲取匯出的函式的地址時,發現不能獲得函式地址。 通過檢查發現是宣告動態庫匯出的定義不同導致: 在使用extern "C" __dec

ios 開發使用 extern "C" __declspec(dllimport) 導致 unknown type name "__declspec"

iOS 開發匯入c++ 檔案 使用extern "C" __declspec(dllimport) 導致 unknown type name "__declspec" 位元組方法,刪除這個部分,ios不需要這個部分

extern C的作用具體解釋

archive 連接方式 一道 org 深入 key ext vxworks 局部變量 轉載於:http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html 1.引言   C+&#

extern C的作用

.net .com sdn extern c question https details 處理 c++編譯 #ifdef __cplusplus extern "C" { #endif //一段代碼 #ifdef __cplusplus } #endif https://

extern c

鏈接方式 全局變量 似的 設計 試題 main 編譯器 extern c 引用 extern "C"的主要作用就是為了能夠正確實現C++代碼調用其他C語言代碼。加上extern "C"後,會指示編譯器這部分代碼按C語言的進行編譯,而不是C++的。由於C++支持函數重載,因

__declspec(dllexport)和__declspec(dllimport)

1、解決的問題:   考慮下面的需求,使用一個方法,一個是提供者,一個是使用者,二者之間的介面是標頭檔案。標頭檔案中聲明瞭方法,在提供者那裡方法應該被宣告為__declspec(dllexport),在使用者那裡,方法應該被宣告為__declspec(dllimport)。二者使用同一個標頭

C++中externC”含義深層探索

之前做很多專案,都用到了extern “C”,這裡整理一下extern “C”的作用。 本文轉自:http://www.cppblog.com/Macaulish/archive/2008/06/17/53689.html 1.引言   C++語言的建立初衷是“a better C”,但

externC” 在C/C++中的使用

1 : 問題定義   在研究作業系統原始碼或者在嵌入式系統中編寫程式時,經常會發現下面這種用法: [cpp] view plain copy    #ifndef __OTHER_FILE_C_H__-----

C/C++混合程式設計--externC” 使用方法詳解

1. 首先要明白: 被extern “C”修飾的變數和函式是按照C語言方式編譯和連結的 (1) 首先看看C++中對類似C的函式是怎樣編譯的。 C++支援函式過載,而過程式語言C則不支援。函式被C++編譯後在符號庫中的名字與C語言的不同。例如,假設某個函式的原型為: void foo( i

C/C++混合程式設計 #ifdef __cplusplus extern "C" {...}

C用gcc方式編譯;C++用g++方式編譯。 C/C++混合程式設計需要關鍵字extern。 c++呼叫c比較簡單,只需要extern; ||  而c呼叫c++則需要考慮c++的函式過載等功能,需要使用 #ifdef __cplusplus extern "C" {...

DLL編寫中externC”和__stdcall的作用

動態連結庫的使用有兩種方式,一種是顯式呼叫。一種是隱式呼叫。 (1)       顯式呼叫:使用LoadLibrary載入動態連結庫、使用GetProcAddress獲取某函式地址。 (2)       隱式呼叫:可以使用#pragma comment(lib, “XX.

C語言呼叫C++中的函式,extern "C"的含義

C++編譯器在將cpp檔案編譯成庫時,匯出的函式名會改變,成員函式會通過加一些元素變成全域性函式,如果這時候我們需要用C語言呼叫C++的函式, 就有了一個問題,那就是不知道C++庫中匯出的函式名,這是由編譯器決定的,這個時候就需要用到extern關鍵字。例子: test.c

extern "C" 用法理解與總結

被extern "C"修飾的變數和函式是按照C語言方式進行編譯和連結的 舉個例子: 1.moduleA、moduleB兩個模組 2.B呼叫A中的程式碼 3.其中A是用C語言實現的,而B是利用C++實現的 //moduleA標頭檔案:moduleA.h #ifnde

extern "C"的使用詳解(轉)

  extern "C"的主要作用就是為了能夠正確實現C++程式碼呼叫其他C語言程式碼。加上extern "C"後,會指示編譯器這部分程式碼按C語言的進行編譯,而不是C++的。由於C++支援函式過載,因此編譯器編譯函式的過程中會將函式的引數型別也加到編譯後的程式碼中,而不僅僅

匯出函式__declspec(dllexport)

關於DLL的函式: 動態連結庫中定義有兩種函式:匯出函式(export function)和內部函式(internal function)。 匯出函式可以被其它模組呼叫,內部函式在定義它們的DLL程式內部使用。 輸出函式的方法有以下幾種: 1、傳統的方法

extern C 淺析

one.h檔案 #pragma once #include<stdio.h> void show(); one.c檔案 #include"one.h" void show() { printf("我是C語言中實現的show函式\n"); } m

c++ __declspec usage

語法說明:__declspec ( extended-decl-modifier-seq ) 擴充套件修飾符:1:align(#)    用__declspec(align(#))精確控制使用者自定資料的對齊方式 ,#是對齊值。 e.g __declspec(align(32)) struct Str1{