DLLモジュール例2:__uを使用する.declspec(dlexport)導出関数、extern"C"規範修飾名、暗黙的接続はdll中関数を呼び出します.

11824 ワード

以下の内容は、複数の文章を読んでまとめて書いた例です.dllプロジェクトの作成については、ブログのもう一つの記事を参照してください.
何か間違いがありましたら、ご指摘ください.
1.ヘッダファイル
 1 //testdll.h

 2 #ifndef _TESTDLL_H_

 3 #define _TESTDLL_H_

 4 

 5 #ifdef TESTDLL_EXPORTS  

 6 #define TESTDLL_API __declspec(dllexport)   //            DLL  ,             

 7 #else  

 8 #define TESTDLL_API __declspec(dllimport)   //            DLL                  

 9 #endif

10 

11 #ifdef __cplusplus

12 extern "C"

13 {

14 #endif

15 

16 namespace MathFuncs  

17 {  

18     // This class is exported from the testdll.dll  

19     // Returns a + b  

20     extern TESTDLL_API double _stdcall Add(double a, double b);

21 

22     // Returns a - b  

23     extern TESTDLL_API double _stdcall Subtract(double a, double b);

24 

25     // Returns a * b  

26     extern TESTDLL_API double _stdcall Multiply(double a, double b);

27 

28     // Returns a / b  

29     // Throws const std::invalid_argument& if b is 0  

30     extern TESTDLL_API double _stdcall Divide(double a, double b);

31 }

32 

33 #ifdef __cplusplus

34 }

35 #endif

36 

37 #endif
__を使うdeclspec(dlexport)はDLLの関数を導き、extern「C」フラグは関数の修飾名を導き、C++プロジェクトでもdll関数を呼び出すことができます.
 1 // testdll.cpp :    DLL          。

 2 

 3 #include "stdafx.h"

 4 #include "testdll.h"  

 5 #include <stdexcept>  

 6 using namespace std;  

 7 

 8 namespace MathFuncs  

 9 {  

10     double _stdcall Add(double a, double b)  

11     {  

12         return a + b;  

13     }  

14 

15     double _stdcall Subtract(double a, double b)  

16     {  

17         return a - b;  

18     }  

19 

20     double _stdcall Multiply(double a, double b)  

21     {  

22         return a * b;  

23     }  

24 

25     double _stdcall Divide(double a, double b)  

26     {  

27         if (b == 0)  

28         {  

29             throw invalid_argument("b cannot be zero!");  

30         }  

31         return a / b;  

32     }  

33 }
以上がエクスポート関数の定義です.
 1 //demo.cpp

 2 #include <iostream>  

 3 #include "testdll.h"

 4 #pragma comment(lib,"testdll.lib")

 5 using namespace std;  

 6 

 7 int main()  

 8 {  

 9     double a = 7.4;  

10     int b = 99;  

11 

12     cout << "a + b = " <<  

13         MathFuncs::Add(a, b) << endl;  

14     cout << "a - b = " <<  

15         MathFuncs::Subtract(a, b) << endl;  

16     cout << "a * b = " <<  

17         MathFuncs::Multiply(a, b) << endl;  

18     cout << "a / b = " <<  

19         MathFuncs::Divide(a, b) << endl;  

20     return 0;  

21 }
これはテストのデモです.隠し接続はdll関数を呼び出します.必ず3つのセットが必要です.h.lib.dll.
いらっしゃいませ