情况如下:
1、用Win32写的Directx程序,后来根据需要想加入MFC类库。
2、工程设置里面都设置好了,使用了MFC shared DLL,多线程之类的。
3、插入了对话框资源,保存为资源文件,并加入到了工程,用classwizard生成了一个对应的类CSceneEditDlg。
4、对话框ID经检查对应无误且无重复。问题:如下代码在调用DoMoDal的时候会崩溃,
CSceneEditDlg SceneEditDlg;
if (SceneEditDlg.DoModal() == IDOK)
{}
具体描述如下:Debug Assertion Failed!
FIle:afxwin1.inl
Line:22经step into 发现是里面的AfxGetResourceHandle()抛出的异常,不知道是什么原因,请高手指教!谢谢!

解决方案 »

  1.   

    补充一下:
    AFX_MANAGE_STATE(AfxGetStaticModuleState());//加上这句也出现一样的错误
    CSceneEditDlg SceneEditDlg; 
    if (SceneEditDlg.DoModal() == IDOK) 
    { }哥们知道的帮帮忙吧!我百度、Google都找不到答案啊
      

  2.   

    你是指把整个工程改成MFC工程?不改不可以吗?因为我的Directx对速度要求较高
      

  3.   

    用release模式应该会忽略这个错误,你可手动调函数AfxSetResourceHandle把resoucehandle设上就好了。
      

  4.   

    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
    {
    AfxWinInit(hInst, NULL, "", 0);  //加这一句,我已经测试过        .......
    }
    揭帖吧
      

  5.   

    原因就是MFC的应用程序有一个全局的CWinApp theApp对象,这个对象会在调用WinMain之前被构造,而MFC在构造CWinApp的过程中会去初始化一个叫AfxGetModuleState类似的全局数据结构。我们在WinMain的一开始就去手动调用AfxWinInit即可完成这些的初始化.
      

  6.   

    同上,如果没使用CWinApp类,是调用AfxWinInit的。
      

  7.   

    laiyiling说的没错,AfxWinInit调用后不再发生原来那样的错误了。可是还是会死掉,不知道是什么原因,但不是原来的异常了。laiyiling知道的,麻烦告诉一下,谢谢!!貌视要一天后才可以加分,到时一定给分。
      

  8.   

    调试后弹出如下错误:
    Unhandled exception in Inhabitants.exe(mfc42.DLL):0xc0000005:Access Violation
      

  9.   

    我用下面的方式产生窗口,并没有问题:
    CSceneEditDlg SceneEditDlg;
    SceneEditDlg.Create(IDD_DIALOG_SCENE, NULL);
    SceneEditDlg.ShowWindow(true);可是如果用SceneEditDlg.DoModal()却还是会出错,暂时还是不知道原因。
      

  10.   

    我的DEMO用DoModal是可以的,这个目前只能你自己调试了,也可能是其他方面的原因.
      

  11.   

    我调试到AfxGetThread()->PumpMessage()发现,AfxGetThread()返回的是空指针啊,就这里出错了。知道怎么解决吗?
      

  12.   

    你的代码是怎么写的?我用下面的写法是没问题的。
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    {
    AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    CDialog dlg(IDD_ABOUTBOX);
    dlg.DoModal();
    return 0;
    }
      

  13.   

    to laiyiling: mfc不是本身都用了多线程吗?to cnzdgs:我也差不多是那样写的,只是之前会有一些DirectX的初始代码。
    不过你那个CDialog dlg(IDD_ABOUTBOX);没问题吗?没有那个构造函数吧?
      

  14.   

    CDialog有这个构造函数:
    explicit CDialog(
       UINT nIDTemplate,
       CWnd* pParentWnd = NULL 
    );如果在线程中使用DoModal,线程需要用AfxBeginThread创建。
      

  15.   

    我的程序并没有创建新的线程,DoModal也是在WinMain里面测试的。
    clean/rebuild过了,还是会崩溃,是不是使用MFC还需要初始化什么呢?就像那个AfxWinInit一样。
      

  16.   

    你用的是VC6吧?试试定义一个全局的CWinApp类变量应该就可以了。
      

  17.   


    cnzdgs你说对了,定义一个全局的CWinApp类变量之后的确解决了问题。大概CWinApp的构造函数里面进行了必要的初始化吧。多谢各位捧场,回头一定把分加上!
      

  18.   

    学习中,还没有在MFC中用过DirectX
      

  19.   

    在 Direct 9.0 2004年版本里有例子,你自己看一下