正文

DLL中调用Dialog的奇怪现象 2007-09-14 14:43:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/29414.html

分享到:

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中获得

阅读(19956) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册