- 显示加载dll
- HMODULE LoadLibrary(LPCTSTR lpFileName);
- lpLibFileName 指定要载入的动态链接库的名称
- 返回HMODULE,成功则返回库(即dll)模块的句柄,零表示失败,HMODULE和 HINSTANCE一样
- 注:这个函数也可以加载可执行模块exe文件,用以访问对话框、位图、图标资源
- FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName );
- hModule 包含此函数的DLL模块的句柄
- lpProcName 包含dll函数名的以NULL结尾的字符串
- 如果函数调用成功,返回值是DLL中的输出函数地址。如果函数调用成功,返回值是DLL中的输出函数地址。
- BOOL FreeLibrary(HMODULE hModule);
- hModule 为要释放的那个Dll的模块句柄。
- HMODULE LoadLibrary(LPCTSTR lpFileName);
void CTestDllDlg::OnBnClickedBtnAdd()
{
// TODO: 在此添加控件通知处理程序代码
HINSTANCE hinst;
hinst=LoadLibrary(_T("Dll1.dll"));//显示加载dll
//int add(int a,int b);
typedef int (*ADDPROC)(int a,int b);//定义的add函数指针
ADDPROC Add=(ADDPROC)GetProcAddress(hinst,"?add@@YAHHH@Z");//获得dll中的add函数地址
if(!Add)
{
MessageBox(_T("获取函数地址失败"));
return;
}
CString str;
str.Format(_T("5+3=%d"),Add(5,3));
MessageBox(str);
FreeLibrary(hinst);//释放dll模块句柄
}
注:仅需要把Dll1.dll放到工程文件目录下即可 ,其中?add@@YAHHH@Z为函数add导出后变为的名字。当然也可以用def文件不让Dll1.dll编译后名字改变。
- 用def解决名字改变的问题,其中add,subtract,output(类中函数)为Dll2中的函数
LIBRARY
EXPORTS
add
subtract
output
此时上面的显示调用Dll2中函数名可以更改
ADDPROC Add=(ADDPROC)GetProcAddress(hinst,"add");//获得dll中的add函数地址