最近要写一个程序。程序的主要实现是:将包含业务处理的对话框类封装到dll中,然后在主程序的对话框中显示出来。
主程序的对话框中会有一个CTabCtrl,dll中的对话框将以标签页的形式显示出来。但是现在,总是运行出错。
========下面是dll中到处部分================
extern "C" __declspec(dllexport) void CreatePlugin(CWnd* pParentWnd, CPluginBase** ppPlugin)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
*ppPlugin = new CCalcDlg(pParentWnd);
(*ppPlugin)->Create(IDD_CALC, pParentWnd);
}
其中,CCalcDlg就是包含业务处理的类,继承自CPluginBase。CPluginBase继承自CDialog。
========下面是主程序中调用部分======在主程序的OnInitDialog中=======
hInst = LoadLibrary(szPluginFile);
lpCreate = (LPCREATEPLUGIN)GetProcAddress(hInst, "CreatePlugin");
if (lpCreate != (LPCREATEPLUGIN)NULL)
{
    (*lpCreate)(this, &pPlugin);
}
FreeLibrary(hInst);
===========================================
现在的问题是,(*ppPlugin)->Create(IDD_CALC, pParentWnd);这个老运行出错。
高手们,帮下忙。

解决方案 »

  1.   

    资源的问题.创建之前有没有AfxSetResouceHandle(hDllModule)?
      

  2.   

    楼上能说的更具体吗?
    AfxSetResouceHandle(hDllModule),这个是在DLL中?
      

  3.   

    或者给个例子程序,我在网上找了下,都只是在导出函数中DoModal,不能满足我的要求
      

  4.   

    exe中,HINSTANCE hDll = LoadLibrary(yourdll);
    hRes = AfxGetResourceHandle();
    AfxSetResouceHandle(hDll);
    Create........
    AfxSetResouceHandle(hRes);另,你的Dll类型是?
    --------------------------------------------------------
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
      

  5.   

    参看:
    http://www.vczx.com/article/show.php?id=201
      

  6.   

    还有
    http://www.vczx.com/article/show.php?id=200
      

  7.   

    需要访问Dll资源之前 AfxSetResouceHandle(hDll);
    访问完后 AfxSetResouceHandle(hApp);
      

  8.   

    Dll的类型是规则MFC DLL Use MFC in a Shared DLL。
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 加了这个就可以实现资源的切换了。
    我刚才单步了下,总是在 CWnd::CreateDlgIndirect的
    if (pParentWnd != NULL)
    ASSERT_VALID(pParentWnd);
    这里报错。
    也不知道有没有这样的例子,比如主对话框中有个CtabCtrl,每个标签页都被封装到dll中。
      

  9.   

    你的DLL包含了MFS相关资源及库没有,建议创建MFS扩展DLL来实现
      

  10.   

    不能在这里FreeLibrary,因为DLL还要使用,要得到空间销毁、对象释放后才能卸载DLL。