2种使用DLL的方式:
①.load-time (需要链接Lib文件)
函数声明__declspec(dllimport) 可选,其他声明必选!
②.run-time
第一步:LoadLibrary
第二步:GetProcAddress (无UNICODE版本!)
第三步:使用……
DLL制作:
首先说下Entry-Point Function,这个是可选的
原型:
BOOL WINAPI DllMain(
[in] HINSTANCE hinstDLL,
[in] DWORD fdwReason,
[in] LPVOID lpvReserved
);
根据MSDN 函数名DllMain是可以自定义的。(这个问题以后说吧)
那什么时候调用呢。
4种情况
A process loads the DLL.
A process unloads the DLL.
A new thread is created in a process that has loaded the DLL.
A thread of a process that has loaded the DLL terminates normally, not using
TerminateThread or TerminateProcess.
===============================分割线来了======================================
DLL中的东东分为2种,导出和内部。内部暂时无视,来说下导出!
MSDN给了3种导出方法
第3种不怎么用,用到了映射导出。
说下前2种:
①。模块定义文件
②。__declspec(dllexport)
现在来说下这2种对于extern "C"和几种调用约定的支持。
【以下说的支持是在函数GetProcAddress第二个参数。】
①模块定义文件→Just支持extern "C" 。
而C++函数则需要去获得修饰名:
用DUMPBIN /EXPORTS 文件名。这种比较麻烦建议用另外一种:/MAP链接选项
设置方法:链接器→调试→生成映射文件
在Debug文件夹会有个.map文件,修饰名去里面找。
②__declspec(dllexport)
只支持 默认调用约定 + extern "C"
__stdcall则需要使用修饰名了。。对于VC++编译器的:_name@bytes(参数字节数)
C++函数不支持。需要给出修饰名。所以__declspec(dllexport)对于run-time链接感觉很废材
不过某些方面算方便。
===============================分割线又来了======================================
下面说下load-time链接。
建议__declspec(dllimport) 不要省,即使是可选的函数声明。
这个我没怎么用,以后补上