DLL导出对话框,主对话框程序调用DLL对话框


代码片段


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);
#### //切记此处不要释放指针,否则无法正常显示
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值