第19讲——动态连接库

1,创建一个win32的dll项目,编译。在vs的安装目录下的E:\visual stdio 2015\VC\bin执行vcvars32.bat,使得dumpbin.exe可用。使用dumpbin -exports ConsoleApplication1.dll能够查看动态连接库的导出函数。若是要导出函数,则在动态连接库的函数名前要加_declspec(dllexport),如_declspec(dllexport) int add(int a, int b)函数

2,在要调用动态连接库的工程里 先声明 extern int add(int a, int b);而后再使用,而且在工程中要加入动态连接库生成的ConsoleApplication1.dll 和ConsoleApplication1.lib。 _declspec(dllexport)标识符声明的函数效率更高,相对于用externspa

3,能够用dependency walker查看动态连接库中导出的函数字符串

4,若是动态连接库项目中源程序本身要使用动态连接库函数,则在动态连接库头文件中使用预编译宏编译器

#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllexport)
#endif // DLL1_APIstring

动态连接库源文件中使用io

#define DLL1_API _declspec(dllexport)
#include "dll1.h"编译

5,本身搜MSDN时找到的一种在各类字符串类型之间进行转换的方法  https://msdn.microsoft.com/zh-cn/library/ms235631(v=VS.100).aspx效率

如char 和wchar_t之间的转换程序

char *orig = "Hello, World!";
size_t newsize = strlen(orig) + 1;
wchar_t * wcstring = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE);

6,在MFC中能够调用GetForegroundWindow(),返回指向前台窗口(使用用户当前)的窗口。方法

7,为了防止在不一样的编译器中以及C++编写的动态连接库能被用c写的程序调用,则在导出函数前要加extern “C” 如#define DLL1_API extern "C" _declspec(dllexport)

8,若是导出函数的调用约定使用了标准调用约定_stdcall 能够经过模块定义文件的方式来解决名字改编的问题。模块定义文件的后缀名是.def,模块定义文件能够按以下所示写:

LIBRARY DLL2

EXPORTS
add
subtract

9,对动态连接库的使用能够有隐式链接(经过头文件和加入连接库.lib),和动态加载(LoadLibrary函数,GetProcAddress函数获取导出函数的地址)。如:

HINSTANCE hinst;
hinst = LoadLibrary(_T("DLL2.dll"));
typedef int(*addProc)(int a, int b);
addProc pdd = (addProc)GetProcAddress(hinst, "add");

10,MAKEINTRESOURCE()宏,能够将动态连接库序号转化为字符串

11, DLLMain动态连接库入口函数

12,在不须要动态连接库的时候,能够用FreeLibrary();

相关文章
相关标签/搜索