各位朋友,大侠,专家你们好,
小弟近日遇到了一个问题,网上百搜而不得其解,甚是郁闷。
问题场景如下:
我用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;这几句代码确实能让控件在对话框上显示出来,但是,当我点击一下这个控件的时候,整个应用程序就被挂起来,不动了,死掉了。这是为什么呢?
小弟近日遇到了一个问题,网上百搜而不得其解,甚是郁闷。
问题场景如下:
我用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;这几句代码确实能让控件在对话框上显示出来,但是,当我点击一下这个控件的时候,整个应用程序就被挂起来,不动了,死掉了。这是为什么呢?
见到网上有人说可以这样实现自制控件的动态加载,
但没有一个能提供demo的。codeproject上有个例子,
但那是加载系统自带的activeX控件的,不是自制的。
超级郁闷,几天时间了,毫无进展,无从下手。
#implort "XXX.dll"
之后会在debug/或者是/release文件里面生成你的控件的包装类,你在窗口里声明一个包装类的成员变量,
用他的Create之类的方法动态创建吧
在此我总结下我解决的办法:
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);