概述
虽然最近临近期末考试,但是我还是抽了一些时间去搞C++,因为要在12月底之前写出一个本地文件搜索引擎,所以只能加紧学习啦!
动态库,全称动态链接库(Dynamic Link Library),关于这东西的介绍,详见MSDN-DLL,这里只说说怎么用最简洁的方式生成自己的dll文件。
环境
- 此处默认使用visual studio 2017 community版本
- windows 10 Pro 1703
步骤
至于怎么在visual studio 中新建工程,这个就不多说了吧,要是不会用VC++,出门别说自己是学C++的……
但是有一些需要说明的,在工程向导中,一定记得勾选如图所示的按钮,才方便创建一个简洁而且完全自定义的C++ dll
- 切记,一定要有导出符号,否则不方便其他语言(主要是C#)调用
- 如果不勾选空项目,会默认生成dllmain.cpp和stdafx.h以及stdafx.cpp三个文件,而这三个文件基本上用不到……
新建工程完毕后,在头文件和源文件中分别添加要创建的文件,此处以HelloWorld.cpp和HelloWorld.h为例分析
代码分析
HelloWorld.h
#include <sdkddkver.h> //系统库,用于确定运行平台版本
#include <Windows.h> //系统库,包含几乎所有windows API
//一些必须的宏定义
#ifdef HELLOWORLD_EXPORTS
#define HELLOWORLD_API __declspec(dllexport)
#else
#define HELLOWORLD_API __declspec(dllimport)
#endif
namespace HelloWorld
{
class onScreen
{
public :
static HELLOWORLD_API void Print(void);
static static HELLOWORLD_API void Import(void);
private:
void am(void); //此函数未定义
};
}
- 宏定义解释
- dllName_EXPORTS 输出符号定义,需在应用程序向导处勾选导出符号,在本例中为HELLOWORLD_EXPORTS
- dllName_API 定义API函数的入口,需要在外部调用的函数需加此声明
- dllName_API为__declspec()的宏定义,若定义dllexport,则不需要.def文件声明函数接口;若为dllimport则需.def文件显式声明函数接口
- 关于static
- 必须使用static,因为外部调用非静态成员函数是违反语言规则的;需要访问非静态成员需要首先初始化它,然后调用
- 可以不使用namespace,此处是采用的C++的写法
HelloWorld.cpp
// HelloWorld.cpp : 定义 DLL 应用程序的导出函数。
//
#include "HelloWorld.h"
#include <iostream>
using namespace std;
using namespace HelloWorld;
void onScreen::Print(void)
{
cout << "Hello, VC++ Dll!" << endl;
}
void onScreen::Import(void)
{
onScreen::Print();
}
- 这段代码只是对HelloWorld.h中函数声明的定义,不需要太多解释
- 到这里就可以启动生成了,会编译输出两个文件,.lib和.dll,如果需要在C++中调用,则需要lib文件进行编译,如果是在C#或者其他语言中调用,则仅需要dll文件即可
- 下次聊聊在C++中的调用吧,顺道补上如何访问非静态成员的方法