各位朋友,大侠,专家你们好,
    小弟近日遇到了一个问题,网上百搜而不得其解,甚是郁闷。
问题场景如下:
    我用ATL开发了一个Composite Control类型的复合控件,这个控件的接口有方法和事件函数。编译生成dll文件MySvr.dll,控件的CLSID和接口IID在一个头文件MySvr.h里被声明,现在,我想在MFC工程里在程序运行时加载这个控件,并对话框上将这个控件显示出来,代码如下:
//包含文件
#import "...\Debug\MySvr.dll"
#include "...\MySvr.h"//OnInitDialog函数里
    CAxWindow wndx;
    CComPtr<IUnknown> punkCtrl;
    CComQIPtr<IAtlComp> pIAtlComp; //接口
    wndx.Create(*this,rc,_T(""),WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN);
    wndx.CreateControlEx(L"{97FE8195-1F78-4C37-8D69-8D994005C221}",NULL,NULL,&punkCtrl);
    pIAtlComp=punkCtrl;这几句代码确实能让控件在对话框上显示出来,但是,当我点击一下这个控件的时候,整个应用程序就被挂起来,不动了,死掉了。这是为什么呢?

解决方案 »

  1.   

    调不了啊,动都动不了,只能在任务管理器里关闭。
    见到网上有人说可以这样实现自制控件的动态加载,
    但没有一个能提供demo的。codeproject上有个例子,
    但那是加载系统自带的activeX控件的,不是自制的。
    超级郁闷,几天时间了,毫无进展,无从下手。
      

  2.   

    在MFC里面使用的话,你试试 
    #implort "XXX.dll"
    之后会在debug/或者是/release文件里面生成你的控件的包装类,你在窗口里声明一个包装类的成员变量,
    用他的Create之类的方法动态创建吧
      

  3.   

    谢谢各位,问题已经解决。
    在此我总结下我解决的办法:
    LoadLibrary(/*dll的文件位置*/);
    Get the DllRegisterServer function address in dll server and call it,
    and then do it like that:
    CWnd axwnd;
    axwnd.CreateControl(/*在此传入一个com组件的uuid*/);
    axwnd.ShowWindow(SW_SHOW);