DLL中的对话框DoModal()调用出错(以一般函数调用方式封装,不直接导出对话框)解决方法

DLL中的对话框DoModal()调用出错(以一般函数调用方式封装,不直接导出对话框)
原帖:http://topic.****.net/u/20081212/21/d9fc11b0-3ee0-4458-bc5d-84448294a656.html?seed=1848472261

MFC Extension DLL,内部有一个CDlgXXXX,封装在一个函数中:

int getXXXX(char *XX, char *XXX)
{
char Reader[8]="";
GetParam("READER", Reader);

if( Reader[0]=='0' )
{
CString Info;
CDlgXXXX dlg; //这是一个自定义的对话框,未导出
if( dlg.DoModal() == IDOK ) //release版本报错:Unhandle Exception in XXX.exe(MFC42.DLL) 0XC0000005 Access Violation
{
.......
 
//exe对这个dll的调用方式为 LoadLibrary+GetProcAddress 方式;debug版本无报错
==============================================================
同时,还有一个现象:
exe直接使用 LoadLibrary+GetProcAddress 调用dll导出函数时候,dlg.DoModal()报错;
但是,使用了一个ocx控件,在ocx控件中以LoadLibrary+GetProcAddress 调用dll导出函数,然后在exe中调用ocx的接口,发现dlg.DoModal()可以正常工作

问题:
1 为何dlg.DoModal()会报错?有朋友提出是Dialog初始化失败,那为何在ocx中可以正常显示并完成函数功能?
2 断点发现 Dialog hWnd=0x00000000,即使是在Debug模式下程序已经正常运行了,DoModal后的dlg.m_hWnd依然是0x00000000,何解?如果说对话框初始化失败,那么之前显示的对话框是?
3 似乎如果在dll中是use MFC in shared DLL, 那么对话框相关操作是需要模块状态的吧?可是在我的dll中并没有这部分的代码,为何也可以工作?(虽然Release版本出错,但是它是在对话框出现后马上报错的,可以看到弹出的对话框就是在DLL中定义的对话框)

求解!

------解决方案--------------------
DoModal会间接调用对话框类的很多函数,要找出具体在哪个函数中出错才行。Release版只要让编译、连接都生成调试信息就可以调试,用F5运行程序,出错时选择“重试”、“中断”,程序会停在出错的位置,再打开“调用堆栈”窗口可以看到程序经历了哪些函数调用,由内向外逐层查找问题的根源。
------解决方案--------------------
有没有加上AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
没有的话在函数最前面加上
int getXXXX(char *XX, char *XXX) 

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
char Reader[8]=""; 
GetParam("READER", Reader); 

if( Reader[0]=='0' ) 

CString Info; 
CDlgXXXX dlg; //这是一个自定义的对话框,未导出 
if( dlg.DoModal() == IDOK ) //release版本报错:Unhandle Exception in XXX.exe(MFC42.DLL) 0XC0000005 Access Violation 

....... 

------解决方案--------------------
Dialog hWnd=0x00000000
 --- 这个多数就是对话框创建过程中失败了,返回FALSE,对话框没有创建成功,所以为NULL。
------解决方案--------------------
探讨
Dialog hWnd=0x00000000
--- 这个多数就是对话框创建过程中失败了,返回FALSE,对话框没有创建成功,所以为NULL。

------解决方案--------------------
在DLL入口函数的最后面,有一段注释说明,说明了DLL中包含OCX等情况的操作。而DEBUG版无错,RELEASE版出错似乎与这个无关。



------解决方案--------------------
以前开发VS2005插件的时候也遇见了类似问题 , 就算设置了资源句柄也报错。

最后是直接CreateDialogIndirect解决的

你可以查看MFC源码, 把DoModal函数的代码写到你的类里面, 命名为DoModalEx

然后你跟踪, 看是哪个资源找不到, 自己改改就可以了