dll的基础知识
(复习一以前的知识)
Dllmain()导入函数。(仅有导出资源的Dll可以没DllMain函数)
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
Dll导出函数的方式:*.def文件或_declspec(dllexport)关键字:
①*.def 文件必须至少包含下列模块定义语句:
■文件中的第一个语句必须是 LIBRARY 语句。此语句将 .def 文件标识为属于 DLL。LIBRARY 语句的后面是 DLL 的名称。链接器将此名称放到 DLL 的导入库中。
■EXPORTS 语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。
■注释语句,在语句前面加分号 “;” 。
例如:
;DLLTest.def : Declares the module parameters for the DLL.
LIBRARY "DLLTest"
EXPORTS
add @1
fun @2
②_declspec(dllexport) 导出方式:
为了防止名字改编,将 extern "C" _declspec(dllexport) 语句放在想要导出函数的声明前面;
例如:
extern "C" _declspec(dllexport) int add(int a, int b);
备注◆:,可以利用Depends工具(vc6.0中有)查看一下所生成的DLL,看看导出函数是否成功
dll函数导出的方法显示连接和隐式连接
隐式链接:
#pragma comment (lib,"F:\\MFC李子平\\MFCvs2008\\DLL\\DllTest\\Debug\\DllTest.lib")
_declspec (dllimport) int add(int a,int b);
显示连接:
函数指针声明
typedef int (*DEC_FUNC) (int a, int b);
HMODULE hMod = LoadLibrary(_T("dll的绝对路径"));
if (hMod)
{
DEC_FUNC pdec = (DEC_FUNC)GetProcAddress(hMod,"dec");
if (pdec)
{
//针对导出函数的操作
}
FreeLibrary(hMod);
}