原帖:http://topic.csdn.net/u/20081212/21/d9fc11b0-3ee0-4458-bc5d-84448294a656.html?seed=1848472261MFC 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中定义的对话框)求解!

解决方案 »

  1.   

    DoModal会间接调用对话框类的很多函数,要找出具体在哪个函数中出错才行。Release版只要让编译、连接都生成调试信息就可以调试,用F5运行程序,出错时选择“重试”、“中断”,程序会停在出错的位置,再打开“调用堆栈”窗口可以看到程序经历了哪些函数调用,由内向外逐层查找问题的根源。
      

  2.   

    有没有加上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 

    ....... 
      

  3.   

    理论上搞不明白,只能通过调试确定原因,推荐楼主到微软的网站把mfc42这些库的pdb下载下来,用windbg调试,我刚看了下,DoModal这个函数执行代码并不是很多
      

  4.   

    还是最好先Debug等调试一下,单步跟踪一下,找到看到底出错什么地方
      

  5.   

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

  6.   


    实际并不是这样,首先在debug的时候是不能跟进到DoModal函数中去的,因此,函数内发生了什么我们不知道,其次,如此跟踪看到的hWnd只能是在DoModal之前和之后,也就是得到分配前和释放后,也就是说,我们看到了hWnd=0x00000000并不意味着创建失败,实际上你在对话框的类中重载OnInitDialog再看一下hWnd就可以看到,这里重载OnInitDialog也是一个办法,楼主不妨一试
      

  7.   

    1  重载了 OnInitDialog, 发现该方法没有被调用 = =
    2  release版增加调试信息后,运行出错点击“调试”,报内存错,无法进入调试界面请教···
      

  8.   

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

  9.   

    1、没有进入OnInitDialog说明在此之前就出错了,看看在此之前的代码。
    2、“报内存错”时有没有“重试”或者“中断”按钮?
      

  10.   

    以前开发VS2005插件的时候也遇见了类似问题 , 就算设置了资源句柄也报错。最后是直接CreateDialogIndirect解决的你可以查看MFC源码,  把DoModal函数的代码写到你的类里面, 命名为DoModalEx然后你跟踪, 看是哪个资源找不到,  自己改改就可以了
      

  11.   

    我碰到了和你一样的问题,在一个OCX里面要弹出一个模态对话框,结果发现是因为没有把对话框的资源加进来的原因