隐式链接
- DLL编译完成后生成*.dll与*.lib,但其生成的*.lib文件与静态链接库的不同,动态链接库中的*.lib里不包含代码,只包含一些辅助性的信息。
- 代码完全在*.dll中,所以只使用*.dll单文件也可以使用,但是只能使用显式链接(加载DLL、获取函数地址、释放DLL)。
- 如果有了*.dll与*.lib文件即可使用隐式链接。
- 将 *.dll 与 *.lib 放到工程目录中。
- 将 #pragma comment(lib, "DLL名称.lib") 添加到调用文件中。
- 加入函数的声明:__declspec(dllimport) 调用约定 返回类型 函数名称 (参数列表);
- __declspec(dllimport) __stdcall int Plus (int x, int y);
- __declspec(dllimport) __stdcall int Sub (int x, int y);
- 然后像使用自己的函数一样,使用自己的函数一样没有区别:
- int a = Plus(1, 2);
- int b = Sub(5, 1);
- 注意:
- extern "C" _declspec(dllexport) 调用约定 返回类型 函数名 (参数列表);
- extern "C" _declspec(dllimport) 调用约定 返回类型 函数名 (参数列表);
DllMain函数
DLL的Main函数可能会执行多次。
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
参数 | 作用 |
---|---|
hModule | 被加载到什么位置 |
ul_reason_for_call | 被调用的原因 |
lpReserved | If fdwReason is DLL_PROCESS_ATTACH, lpvReserved is NULL for dynamic loads and non-NULL for static loads. If fdwReason is DLL_PROCESS_DETACH, lpvReserved is NULL if FreeLibrary has been called or the DLL load failed and non-NULL if the process is terminating. |