代码片段
DLL导出对话框
随调用进程的关闭而关闭,如果使用domodel则不会随调用进程关闭而关闭
CTestDlg * dlg=NULL; //定义一个全局变量,防止主程序多次调用多个dll对话框
extern "C" __declspec(dllexport) void ShowDlg()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
do
{
if (NULL == dlg)
{
if (NULL ==(dlg = new CTestDlg()))
{
break;
}
if (!dlg->Create(IDD_TEST_DIALOG))
{
delete dlg;
dlg = NULL;
break;
}
}
dlg->ShowWindow(SW_SHOW);
}while(0);
}
对话框主程序调用dll对话框
方法一:
void CTestdllDlg::OnBnClickedButtonLoad4()
{
HMODULE hModule = NULL;
typedef void (*Func)();
// 动态加载 DLL 文件
hModule = LoadLibrary(_T("test.dll" ));
//在此判断hModule是否为空
// 获取dll 函数地址
Func fdllload= (Func)GetProcAddress(hModule, "ShowAddrBook" );
//在此判断fdllload是否为空
// 使用函数指针
fdllload();
// 释放指针
//FreeLibrary(hModule);
#### //切记此处不要释放指针,否则无法正常显示
}
第二种调用,基本类似
void CTestdllDlg::OnBnClickedButton1()
{
HINSTANCE hInstance;
hInstance = LoadLibrary(_T("test.dll"));
if(hInstance == NULL)
{
CString strError;
strError.Format(_T("加载test.dll出错,错误代码:%d"),GetLastError());
MessageBox(strError);
return;
}
FARPROC proc = GetProcAddress(hInstance,"ShowDlg");
if (proc == NULL)
{
CString strError;
strError.Format(_T("GetProcAddress出错,错误代码:%d"),GetLastError());
MessageBox(strError);
return;
}
proc();
//FreeLibrary(hInstance);
#### //切记此处不要释放指针,否则无法正常显示
}