最近VC开发中遇到一个很要命的问题,把试图类的派生类封装在动态库中并且通过支持自动化做成组件,但是在用的时候只要有ocx控件同时使用且能进行窗口切换,系统准死!
请求MFC和com高手解答,为了说明情况,把做的内容简化
视图组件:
(1)使用用MFC常规动态库
(2)动态库内添加CView派生的视图类CTestView类,添加时选择“支持自动化”,
(3)CTestView保露出一个接口CreateThis(HWND hWnd,long left,long right,long top,long bottom);
使用组件:
(1)用向导新创建一个多文档工程TestMyView
(2)在CTestMyViewView类的OnCreate中创建上述组件,并调用组件的CreateThis接口函数,把当前视图窗口句柄传入,使得组件内封装的视图创建。在这个时候视图功能一切正常,无论怎么使用都可以,不过如果在程序中添加一个控件窗口,比如在无模式对话框上拖一个日历控件,那么在对话框和程序视图窗口之间鼠标焦点切换几次后系统就会崩溃,百试百灵,有高手如果不愿意试验可以发邮件[email protected]要源代码例子,
请对MFC和COM内部机制比较熟悉的高手帮忙查查什么原因,快被整死了!!!!!!!!

解决方案 »

  1.   

    视图类组件:
    1、视图类
    class CBaseView : public CWnd
    {
    protected:
    CBaseView();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(CBaseView)// Attributes
    public:// Operations
    public:
      long CreateThis(long hParent, long left, long top, long right, long bottom);
    ................
    2、接口定义
    。。
    [ uuid(3889365C-4968-42D1-94B1-C970D3654BF7) ]
    dispinterface IBaseView
    {
    properties:
    methods:
    [id(1)]  long CreateThis(long hParent, long left, long top, long right, long bottom);
    };

    3、试验工程的视图类OnCreate函数:
    int CTestViewView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CView::OnCreate(lpCreateStruct) == -1)
    return -1;

    m_pwndView=NULL;
    COleDispatchDriver disp;
    if (disp.CreateDispatch("ComView.BaseView"))
    {
    disp.m_lpDispatch->QueryInterface(DIID_IBaseView, (void**)&m_pwndView);
    CRect rc;
    GetClientRect(&rc);
    m_pwndView->CreateThis((long)m_hWnd, rc.left, rc.top, rc.right, rc.bottom);
    }
    return 0;
    }
    包括其他相关函数,比如OnSize等待。
    到此运行一切正常,实际使用的视图就是组件内的视图。
    4、弹出带有日历的无模式对话框
    void CTestViewView::OnButton32771() 
    {
    CTestDialog* pDlg  = new CTestDialog();
    pDlg->Create(CTestDialog::IDD,this);
    pDlg->ShowWindow(SW_SHOW);
    }
    5、等死...............................一分钟内准死,而且都是在鼠标从对话框移动到视图内的一瞬间。