本人正在做主程序和动态库之间交互的工作。希望主程序作为一个框架,将动态库中的各异的窗口加载到框架中。将主程序中CTabView的指针传递各个动态库,并在动态库中创建相应子窗口——CTabView与其子窗口(child1、child2)与相应的消息传递,已实现。现在的问题是:
1.动态库中CMyListBox.Create(...,pTabView),运行正常,但是只响应WM_SIZE等系统消息,消息反射涉及到的DrawItem不被调用。
2.动态库中CMyDialog.Create(...,pTabView),运行失败,执行此函数时有问题
3.hWnd = CreateDialog(AfxGetResourceHandle()...pTabView),CMyDialog::SubclassWindow(hWnd),运行正常。总觉得不好。
那位专家帮解释一下原因,能够提供解决方案最好!

解决方案 »

  1.   

    调用之前加
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
      

  2.   

    dll导出接口中增加 AFX_MANAGE_STATE(AfxGetStaticModuleState());
    当你需要导出MFC等资源时
      

  3.   

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 已经加过了。才得出上面的结果。
      

  4.   

    AFX_MANAGE_STATE(AfxGetStaticModuleState()); 上面就是加了的结果。
      

  5.   

    最终运行到CreateIndirect时出的错误,似乎是不能用DLL外部的ParentWindow作为父窗口指针,内部会通过断言来检查此父窗口是否有效——通过不了。
      

  6.   

    按照MSDN的说法,似乎不能实现,主窗口与子窗口处于不同的模块/进程,至少无法正常传递消息。
      

  7.   

    模块的run time libarary是否一致...
      

  8.   

    换了一种思路,有点儿偷梁换柱的意思。不知道有没有“漏洞”。传递句柄,通过CWnd::FromHandle(hWnd)得到临时的CWnd指针对象。可以解决CDialog::Create失败的问题,但其他的还是不行。CWnd::FromHandlePermanent(hWnd)的结果为NULL。望各位专家不吝赐教。
      

  9.   

    看楼主的意思,需要把动态库做成扩展的DLL,导出窗口类,在主程序视图里去创建这些窗口.
      

  10.   

    传递pTabView的窗体句柄,然后在动态库里创建一个临时变量CWnd::FromHandle,
    然后再创建子对话框.
      

  11.   

    对的,最后我就用了传句柄的办法。子对话框创建没有问题了,不知道会不会有“漏洞”,得到的那个临时父窗口指针需不需要释放等操作?如果直接用其创建子控件窗口,依然不执行DrawItem等虚函数——与传递窗口指针效果一样。
      

  12.   

    DrawItem是哪里的虚函数,可能跟这个没有关系,是不是你没有设置ownerdraw的属性,导致的.
    你看看其它的消息处理函数能不能执行.
      

  13.   

    比如CMyListBox实现自绘功能,是通过虚函数DrawItem来实现。父窗口与其在同一模块中是可以的,不同模块则不行,是因为当ListBox重绘时,向其父窗口发送消息WM_DRAWITEM消息,而父窗口相应此消息,调用子窗口的虚函数OnChildNotify,内部过程包含虚函数DrawItem。在同一模块中是可以的;不同模块中,父窗口可以收到此消息,但在调用OnChildNotify过程中无效。详见MSDN的说明,其中没有提到怎么解决。
      

  14.   

    关于 OnChildNotify() 的问题,给 LZ 出个主意吧。首先说明,我只是查阅了一下 MSDN,并没有按照下面的方法实做过,如果误导请见谅。OnChildNotify() 是一个虚函数,在 MFC 中,由父窗口类来调用子窗口类的 OnChildNotify() 函数,而子窗口类通过重载这个虚函数而实现相应的功能。(以上所说“窗口类”都是指 MFC 中派生于 CWnd 的类,下同)在普通的 MFC 程序中,这都没问题,而在 LZ 描述的运行环境中,主程序模块里只有父窗口类,子窗口只是一个 HWND 句柄,父窗口类找不到任何可供调用的重载版的 OnChildNotify();另一方面,DLL 模块中只有子窗口类,父窗口只是一个 HWND 句柄,虽然有重载版的 OnChildNotify(),却没有人调用它。所以我想,有一个办法也许可以解决这个问题:在 DLL 中,用一个窗口类对父窗口进行 SubclassWindow(),也不用实现啥功能,只要它是一个 CWnd 对象就好了(我猜测对 OnChildNotify() 的调用应该是在 CWnd 这一级上,而不必是它的什么派生类)。虽然 MSDN 中要求使用 SubclassWindow() 时“The window must not already be attached to an MFC object when this function is called”,但我想这应该不会成为障碍。
      

  15.   

    谢谢各位的指教,受益匪浅。暂时通过FromHandle的方法来实现,马上去试一下“maquan”的方法。结贴了,如有新的思路,继续展开讨论。