本文的目的是 创建一个最小化的dll并使用它
环境:win7 + vs2012
一个VS的解决方案(sln)下面可以有多个项目(project),所以这里新建一个解决方案,然后下面创建两个项目。
新建第一个 Win32 项目 my_dll,注意,是Win32,点 DLL 和 空项目:
在 my_dll 工程的 头文件 里头 添加 新建项 取名 my_dll.h
在 my_dll 工程的 源文件 里头 添加 新建项 取名 my_dll.cpp
my_dll.h里头写入:
1 //------------------ my_dll.h ---------------- 2 3 #pragma once; 4 5 // 该宏完成在dll项目内部使用__declspec(dllexport)导出 6 // 在dll项目外部使用时,用__declspec(dllimport)导入 7 // 宏 MY_DLL_IMPLEMENT 在my_dll.cpp中定义 8 #ifdef MY_DLL_IMPLEMENT 9 #define MY_DLL_API __declspec(dllexport) 10 #else 11 #define MY_DLL_API __declspec(dllimport) 12 #endif 13 14 15 MY_DLL_API double my_add(double a, double b);
my_dll.cpp里头写入:
1 //------------------ my_dll.cpp ---------------- 2 3 // 注意此处的宏定义需要写在#include "my_dll.h"之前 4 // 以完成在dll项目内部使用__declspec(dllexport)导出 5 // 在dll项目外部使用时,用__declspec(dllimport)导入 6 #define MY_DLL_IMPLEMENT 7 8 #include "my_dll.h" 9 10 double my_add(double a, double b) 11 { 12 return a+b; 13 }
然后就变成这个样子:
然后点击 my_dll 解决方案,右键 ->添加->新建项目
新建一个 Win32 控制台程序 use_my_dll
点击 控制台应用程序 和 空项目
在 use_my_dll 工程下的 源文件 添加 新建项 取名 main.cpp
1 //------------------ main.cpp ------------------- 2 #include "my_dll.h" 3 #include <iostream> 4 5 using namespace std; 6 7 int main(char argc, char**argv) 8 { 9 cout << "----------------------" <<endl; 10 cout << "my_add: 3+5=" << my_add(3, 5)<<endl; 11 cout << "----------------------" <<endl; 12 13 system("pause"); 14 return 0; 15 }
然后整个页面如下:
现在 添加新应用 和 附加包含目录
右键 use_my_dll 工程 选择属性,在“属性页”对话框中,展开“通用属性”节点、选择“框架和引用”,然后选择“添加新引用”按钮
显示出 my_dll 工程,勾选并确定(如果my_dll工程和use_my_dll工程在不同的解决方案里,则这一步不会显示出任何工程,需要添加进来才能显示)
再右键use_my_dll属性,依次展开“配置属性”节点和“C/C++”节点,然后选择“常规”。在“附加包含目录”旁边,指定 my_dll.h 头文件的位置路径。
完成了这一步以后还要 右键 use_my_dll 工程将其 设为启动项目,缺了这一步会报错
然后“调试”、“开始执行(不调试)”就能显示出结果了:
所有以my开头的变量和名字都可以随便取名。
要实现复杂点的功能的话可以在头文件my_dll.h中声明命名空间和类,在my_dll.cpp中实现,在main.cpp中调用
三个文件如下:
1 //------------------ my_dll.h ---------------- 2 3 #pragma once; 4 5 // 该宏完成在dll项目内部使用__declspec(dllexport)导出 6 // 在dll项目外部使用时,用__declspec(dllimport)导入 7 // 宏 MY_DLL_IMPLEMENT 在my_dll.cpp中定义 8 #ifdef MY_DLL_IMPLEMENT 9 #define MY_DLL_API __declspec(dllexport) 10 #else 11 #define MY_DLL_API __declspec(dllimport) 12 #endif 13 14 namespace my_namespace 15 { 16 class MY_DLL_API MySimpleDll 17 { 18 public: 19 MySimpleDll(); 20 ~MySimpleDll(); 21 22 double my_add(double a, double b); 23 }; 24 }
1 //------------------ my_dll.cpp ---------------- 2 3 // 注意此处的宏定义需要写在#include "my_dll.h"之前 4 // 以完成在dll项目内部使用__declspec(dllexport)导出 5 // 在dll项目外部使用时,用__declspec(dllimport)导入 6 #define MY_DLL_IMPLEMENT 7 8 #include "my_dll.h" 9 10 namespace my_namespace 11 { 12 MySimpleDll::MySimpleDll() 13 {} 14 15 MySimpleDll::~MySimpleDll() 16 {} 17 18 double MySimpleDll::my_add(double a, double b) 19 { 20 return a+b; 21 } 22 }
1 //------------------ main.cpp ------------------- 2 #include "my_dll.h" 3 #include <iostream> 4 5 using namespace std; 6 using namespace my_namespace; 7 8 int main(char argc, char**argv) 9 { 10 MySimpleDll msd; 11 12 cout << "----------------------" <<endl; 13 cout << "msd.my_add: 3+5=" << msd.my_add(3, 5) <<endl; 14 cout << "----------------------" <<endl; 15 16 system("pause"); 17 return 0; 18 }