调用ActiveX控件?呃,这实在不是一件容易的事情:用各种封装精良的Framework(MFC 、VCL等等)的话,最后成品EXE的体积难免偏大;用SDK虽然可以有效地减小这个体积,但是 往往又无从下手——总之,这似乎是一件鱼与熊掌不能兼得的憾事。还好, “不容易”并不代表“不可能”,李马在本文中要介绍给诸位的,就 是“玩转”ActiveX的一种方法,这种方法包括了从ActiveX控件调用到ActiveX控 件事件处理的一切必要细节。当然,题目所说的“SDK”也并不是纯粹的SDK,而 是借助了ATL的OLE支持,毕竟用SDK实现OLE容器太繁琐了。
在开始正文之前,我还想 说明一下本文所面向的读者群。首先,你必须对SDK的编程方式和COM组件的调用方式有所了 解,因为本文中的绝大部分示例代码都与之相关,涉及到这方面的知识我也不会再加以解释 ;其次,你可以不了解ATL,因为本文中对ATL的使用仅限于ActiveX的OLE容器,我也只是在 适当的地方给予简要的说明;再次,你可以不了解COM连接点的知识,我在文中会给予详细的 介绍。
那么闲话毋庸赘叙,让我们开始吧。
准备工作
现在让我们来完 成代码之外的事情,请按照以下步骤建立我们的工程:
1. 打开Visual C++,新建一 个Win32 Application(我名之为ActiveX)。
2. 新建一个Resource Script(资源脚 本),在其中添加一个对话框(我名之为IDD_MAIN_DLG)。
3. 在对话框上单击右键 ,选择“Insert ActiveX Control...”(如下图)。在本文中,我以Microsoft Agent Control为例,所以在之后的列表之中选择“Microsoft Agent Control 2.0”。
4. 完成后的对话框如下图。
骨架代码
现在就可以编写代码了。建立一个C++ Source File(C++源文件),在其中输入下面的程序 骨架:
#include <atlbase.h>
CComModule _Module;
#include <atlwin.h>
#import "C:\WINNT\msagent\agentctl.dll"
using namespace AgentObjects;
#include "resource.h"
int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
{
_Module.Init( NULL, hInstance );
_Module.Term();
return 0;
}