-
-
[原创]动态链接库笔记
-
发表于:
2009-5-29 17:27
4949
-
这两天看了下动态链接库,一点笔记,高手莫笑
Windows平台下文件名大小写无关
用dumpbin工具查看动态链接库导出函数.
Dos下进入动态链接库当前目录
dumpbin –exports dll.dll
要在希望导出的函数前加上_declspec(dllexport)
例:
_declspec(dllexport) int add(int a,int b)
{
return a+b;
}
外部定义的函数用extern 声明
例:
extern int add(int a,int b);
也可用
_declspec(dllimport) int add(int a,int b);
告诉编译器函数从lib文件中引出
为了方便,弄一个头文件dll.h
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
MYDLL_API int add(int a,int b);
输入库.lib不包含实际代码,仅为编译器提供信息,以便exe文件动态链接时建立重定位表
查看可执行文件输入信息,要用到哪些动态链接库。方法如下:
Dos下进入可执行文件当前目录
dumpbin –imports dll.dll
也可以用Depend可视化工具查看,在vc6.0目录下Tools中
导出一个类
Class _declspec(dllexport) Point //将导出整个类,一般用宏MYDLL_API代替_declspec(dllexport)
{
Void output(){};
};
如果仅导出成员函数,就仅在成员函数声明前加MYDLL_API,类名前不加。但访问没有不同,虽然Point没被导出,仍可在目的工程中构造其对象,并利用对象调用其成员函数(public)。
GetForegroundWindow()得到调用者进程当前窗口句柄。
C++改变函数名,可能导致其他平台访问函数失败。
#define MYDLL_API “extern C” __declspec(dllimport)
#define MYDLL_API “extern C” __declspec(dllexport)
这样仅针对全局函数,成员函数无效。
如果函数调用方式改为非_cdecl,以上方法无效。
解决这个问题,用模块定义文件。如下:
建立文本文件,明名为xx.def。
EXPORTS
Add
funName
表示导出哪些函数。这样不必用__declspec(dllexport)
编译器此时不会改变函数名字。即使改变调用方式。
注意此时调用模块中函数调用方式应作相应改变。
动态加载函数LoadLibrary();也用它加载可执行模块(为利用其资源)。
GetProcAddress();得到要到处函数地址。
动态加载只需.dll文件。
将整数转化为指向常字符串指针变量,用宏MAKEINTRESOURCE.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课