在MFC扩展DLL中生成了一个对话框类,在对话框上面放了一个 ActiveX控件,在DLL的客户程序中导出这个对话框类并DoModal,结果弹出的对话框上面ActiveX控件没有显示出来,我也搜索了以往的帖子,但是解决的方法不明显,现在还是初学者,对C++没有深入的了解,据说需要添加函数AfxOleInit()和AfxEnableControlContainer(),还需要对控件的环境进行初始化,但我基本不动!  现在我只是想要在DLL调用时能在对话框上显示出控件就行了!  望高手指点,谢谢!

解决方案 »

  1.   

    估计是因为DLL的资源和应用程序的资源不在同一个地址段的原因
    试试在DLL的对话框类中重载WindowProc,再里面添加AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
      

  2.   

    extern "C" __declspec(dllexport) void Show()
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CTimeTime time;
    time.DoModal ();
    }
    我已经添加了,但还是不行,而且有时候弹不出对话框
      

  3.   

    确保你的动态库装载成功且接口有效,试试使用显式加载  HINSTANCE hLib = LoadLibrary(_T("you.dll"));
      if(hLib)
      {
        typedef void (*PSHOWFUN)(void);    PSHOWFUN pShow = (PSHOWFUN)GetProcAddress(hLib, "Show");
        if(pShow)
        {
          pShow();
        }
        else
        {
          DWORD dwErr = GetLastError();
          ASSERT(0);
        }
      }
      else
      {
        DWORD dwErr = GetLastError();
        ASSERT(0);
      }  if(hLib)
        FreeLibrary(hLib);
      

  4.   

     做了一个mfc的常规dll,dll中放了一个对话框,对话框上放了一个activex control。生成dll的过程没有问题,但是调用dll出了问题。我在网上已经查了相关资料,大体都说需要做一个初始化,也就是调用 
    OleInITialize(NULL) ; 
    ::CoInITialize(NULL);  
    AfxEnableControlContainer(); 
    现在问题是这些个语句放哪儿。我可能放错地方了(放到APP::InITInstance()函数底下了),导致没有成功。希望大家能帮忙指点一下,告诉我正确的方法,谢谢。 
    这是dll导出函数 
    #include "StdAfx.h" 
    #include "dll_msflexgrid.h" 
    #include "TestDlg.h" extern "C" void _declspec(dllexport)ShowDlg() 
    {  
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CTestDlg dlg;
    dlg.DoModal(); 
    }在CTestDlg对话框上有一个msflexgrid控件 
    这是在另一个程序中的按钮响应函数 
    HINSTANCE hdll; 
    hdll=LoadLibrary("..\\dll_msflexgrid.dll"); 
    if(hdll!=NULL) 

              typedef void (*PFDlgShow)(); 
      PFDlgShow dlgshow; 
    dlgshow=(PFDlgShow)GetProcAddress(hdll,"ShowDlg"); 
            if (dlgshow != NULL) 
                dlgshow(); 
    刚学VC,弄了两天了,没弄明白,希望高手能指点一下,谢谢     .
    编程论坛 1 个网友回答: 大家帮帮看看啊 实在是需要帮忙啊    .
    编程论坛 2 个网友回答: 解决了 原来是在要生成的dll里面添加一个初始化函数 再把那几句加进去就可以了      .
    编程论坛 3 个网友回答: 这种不是应该在EXE中添加么,在EXE中添加