DLL中调用Dialog的奇怪现象 发布时间:2007-5-20 0:45:46 我在一个DLL中使用一个对话框,该对话框中使用了一个custom控件,该控件在Exe中可以正常使用,但是在DLL中使用时,DoModal()返回-1,对话框不显示,这是为什么? --------------------------------------------------------------- 在DllMain中PROCESS_ATTACH的时候调用CoInitialize(),在PROCESS_DETACH的时候调用CoUnInitialize() --------------------------------------------------------------- http://www.vchome.net/tech/dll/dll44.htm 在Dll中创建对话框并调用 作者:freedk 下载本文示例代码 1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。 2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog” 选择“New”,至此对话框已添加到DLL工程中。 3、为对话框添加一新类,如:CTest,基类为CDialog。 4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数: extern "C" __declspec(dllexport) void Show() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CTest test; test.DoModal (); } 别忘了在文件中添加: #include "Test.h":),大功告成,编译吧! 5、用VC新建一对话框工程,在一按钮点击事件中添加如下代码: typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ("mfcdll.dll"); if(hmod==NULL) { AfxMessageBox("Fail"); } TESTDLL lpproc; lpproc = (TESTDLL)GetProcAddress (hmod,"Show"); if(lpproc!=(TESTDLL)NULL) (*lpproc)(); FreeLibrary(hmod); 6、试试看,是不是DLL中对话框显示出来了:) 测试环境:VC6.0+Win2000 --------------------------------------------------------------- 函数开始处要调用AFX_MANAGE_STATE(AfxGetStaticModuleState()); --------------------------------------------------------------- 同意楼上 --------------------------------------------------------------- MFC扩展DLL的资源ID可能与EXE的冲突,解决的方法是在使用DLL资源之前调用AfxSetResourceHandle设置MFC使用DLL作为默认资源加载模块,使用之后再设回来 --------------------------------------------------------------- MFC扩展DLL的实例句柄可以在DllMain中获得

评论