以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html
有什么不对的欢迎指正!!!
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(dllexport)导出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 }
这是一个测试的demo,隐式连接调用dll函数,一定要三件套.h .lib .dll
欢迎指正!!!