这个问题已经郁闷了我快一天了,
 
我做了一个DLL用来实现非模式对话框资源的调用,然后这个DLL已经形成,具体的
导出函数如下:
void ShowDlg()
{
   CMyDlg *pDlg=new CMyDlg();
   pDlg->Create();
   pDlg->ShowWindow();}然后在调用此DLL的应用程序的调用代码如下:
void CTestMyDllDlg::OnOK() 
{
         typedef void (WINAPI *SHOWDLG)();
SHOWDLG ShowDlg;
FARPROC lpfn=NULL;
HINSTANCE hinst=NULL;


hinst=LoadLibrary("MYFIRSTDLL.dll");
if(hinst==NULL)
{
AfxMessageBox("不加载动态连接库");
return;
}

lpfn=GetProcAddress(hinst,"ShowDlg");
ShowDlg=(SHOWDLG)lpfn;
if(lpfn==NULL)
AfxMessageBox("不加载测试函数");
else
ShowDlg();//调用动态连接库函数
}
每次调用的时候都是出现这样的错误:Debug Assertion Failed!
Program:.....TextMyDll.exe
File dlgcode.exe
Line  173 (TextMyDll.exe这是我的调用此DLL的应用程序)清高手指点到底是什么原因引导致的

解决方案 »

  1.   

    void ShowDlg()
    {
       CMyDlg *pDlg=new CMyDlg();
       pDlg->Create(ID_DLG);//ID_DLG:对话框的ID号
       pDlg->ShowWindow();}
      

  2.   

    该地址绝对可以解决你的问题:
    http://community.csdn.net/Expert/topic/3081/3081869.xml?temp=.7213709
      

  3.   

    WINAPI void ShowDlg()
    {
       CMyDlg *pDlg=new CMyDlg();
       pDlg->Create(ID_DLG);//ID_DLG:对话框的ID号
       pDlg->ShowWindow();}可能是约定的问题造成函数返回时地址错误
      

  4.   

    加一句代码就解决问题.void ShowDlg()
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());//添加此行
       CMyDlg *pDlg=new CMyDlg();
       pDlg->Create();
       pDlg->ShowWindow();
    }
      

  5.   

    谢谢大侠的指点,真的多谢多谢。
    问题是解决了,
    不过为什么必须加入
    AFX_MANAGE_STATE(AfxGetStaticModuleState());这条语句呢?
       想多学点,
    谢谢。
      

  6.   

    这个就是MFC对每个模块调用所依赖的一些问题了,也就是模块状态问题,
    相应的实际比较复杂,如果需要去看一下《深入理解MFC》好象是这本里讲的比较清楚。
      

  7.   

    pDlg->Create(ID_DLG);//ID_DLG
    这里出了问题,导致断言错误。看一下MFC中Create的原型:
    BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );第二个参数是对话框的父窗体,默认是NULL,实际上MFC是把进程句柄给过去了。但是,dll不是进程,里面并没有默认的进程句病,如果不调用AFX_MANAGE_STATE(AfxGetStaticModuleState());来指认当前进程的话,就会导致对话框找不到父窗体,明白了吗?
      

  8.   

    MFC中每个模块有自己的模块信息,模块之间切换的时候,这些信息也跟着切换。你的dlg资源是在dll里头的,所以必须要把模块信息设回去。
      

  9.   

    http://community.csdn.net/Expert/topic/3169/3169458.xml?temp=.2631952
    帮忙看一下!!!