DLLモジュール例2:__uを使用する.declspec(dlexport)導出関数、extern"C"規範修飾名、暗黙的接続はdll中関数を呼び出します.
11824 ワード
以下の内容は、複数の文章を読んでまとめて書いた例です.dllプロジェクトの作成については、ブログのもう一つの記事を参照してください.
何か間違いがありましたら、ご指摘ください.
1.ヘッダファイル
いらっしゃいませ
何か間違いがありましたら、ご指摘ください.
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.いらっしゃいませ