1. vs工程类型相关知识
在使用vs创建工程时,如果在“模板”中选的是“Win32”,不管是“Win32控制台应用程序”、还是“Win32项目”,工程创建完成后,在“属性--C/C++--预处理器定义”中都会有宏定义:"WIN32",因此,可以在代码中通过检查是否有宏定义"WIN32"对代码做好windows和linux的控制;
在创建win32的工程时,不论是选择“Win32控制台应用程序”、还是“Win32项目”最终都会跳到”应用程序设置“向导,该向导中需要使用者选择”应用程序类型“,共包括四种:windows应用程序、控制台程序、DLL(D)、静态库(S)。只是起初如果选择的是“Win32控制台应用程序”这里vs将默认在此向导中把类型选择为”控制台应用程序“,如果起初选择的是“Win32项目”这里vs将默认在此向导中把类型选择为”控制台应用程序“windows应用程序”。当我们是要封装dll接口时,在这里要选择“Dll(D)”
在vs创建工程时,如果选择的应用类型是“DLL(D)”时,工程创建完成后,在“属性--C/C++--预处理器定义”中会定义:宏定义"WIN32"、“工程名称(大写字母)_EXPORTS”。
2. 创建dll类型工程的相关知识
在Dll类型的工程中,dll头文件中的宏定义如下:
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 ONEDLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// ONEDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的// 符号视为是被导出的。#ifdef ONEDLL_EXPORTS#define ONEDLL_API extern "C" __declspec(dllexport)#else#define ONEDLL_API extern "C" __declspec(dllimport)
#endif
__declspec(dllexport) 表示函数为DLL输出函数,即其他应用程序可以调用该函数
extern “C” __declspec(dllexport) int add(int a, int b);
其中 extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。
__declspec(dllexport) __declspec(dllimport)一般是使用宏的形式
定义一个接口函数
ONEDLL_API int fnOneDll(void);
3. dll的调用方式
DLL的调用分为两种方式:动态和静态(显示动态链接和隐式动态链接)
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
将生成的.dll和.lib文件拷入到调用dll的工程中,用命令