一、制作dll
1.选择Win32项目命名为"mydll"
2.选择dll,勾选导出符号(这样就有示例模板了)。
1.选择Win32项目命名为"mydll"
2.选择dll,勾选导出符号(这样就有示例模板了)。
3.会生成一系列文件,实际上用到的只有mydll.h,mydll.cpp两个文件,里边有三个例子,一个是全局变量示例,一个是全局函数例子,还有一个是类,只要在他的基础上改就行了,下面演示hello world:
mydll.h文件:
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MYDLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// MYDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
// 此类是从 mydll.dll 导出的
class MYDLL_API MyClass {
public:
// TODO: 在此添加您的方法。
void Say() const;
};
extern MYDLL_API int g_nNum;
MYDLL_API void Say(void);
// 不能是模板函数,不能在此定义函数
mydll.cpp文件
// mydll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "mydll.h"
#include <iostream>
// 这是导出变量的一个示例
MYDLL_API int g_nNum = 0;
// 这是导出函数的一个示例。
MYDLL_API void Say(void)
{
std::cout << "Hello World" << std::endl;
}
// 类成员函数
void MyClass::Say() const
{
std::cout << "Hello World" << std::endl;
}
4.生成->生成解决方案
二、调用dll
1.从生成的dll项目中,找到mydll.dll, mydll.lib, mydll.h放到调用dll的工程根目录中
2.包含mydll.h,#pragma comment(lib, "mydll.lib")就可以调用了
main.cpp文件
#include "mydll.h"
#include <iostream>
#pragma comment(lib, "mydll.lib")
int main()
{
// 1.全局变量
std::cout << g_nNum << std::endl;
// 2.全局函数
Say();
// 3.对象
MyClass().Say();
system("pause");
return 0;
}
三、注意
1.调试的时候dll文件和调用它的cpp文件放在同一目录下;生成的exe和dll要在同一个目录下。比如Debug里的exe不能单独运行,需要把dll拷过来
2.mydll.h中不能定义(实现)函数
3.不能在mydll.h中声明函数模板
1.调试的时候dll文件和调用它的cpp文件放在同一目录下;生成的exe和dll要在同一个目录下。比如Debug里的exe不能单独运行,需要把dll拷过来
2.mydll.h中不能定义(实现)函数
3.不能在mydll.h中声明函数模板