simpleboy 2013/8/20整理 simpleboy2008@163.com
ActiveX在网页开发中经常得到应用,基本的开发步骤为: 第一步:开发ActiveX控件
第二步:在网页中通过JavaScript调用ActiveX控件 第三步:通过浏览器使用ActiveX控件 下面给出具体的例子
一、开发ActiveX控件
在VS2005中,使用编程向导,选择MFC ActiveX控件,如下图所示。
nReg
缺省完成即可。
LONG,一个输入参数num的类型是LONG,添加过程以及添加效果如下图所示。
U然后类视图中的TaxLib类中添加控件的处理函数,添加的函数返回类型是
is
1
te
red其中的AddOne是刚才添加的控件处理方法,AboutBox方法是缺省条件下开发工具自动生成的。后面的使用就可以使用这两个方法来实验了。
双击AddOne函数就可以看到函数定义了,代码如下(对应的文件名为Tax.idl):
// Tax.idl : ActiveX 控件项目的类型库源。
// 此文件将由MIDL 编译器工具处理以 // 产生类型库(Tax.tlb),该类型库将成为 // Tax.ocx 中的资源。
#include [ uuid(DC2A37EC-649B-42E9-8243-4EA232ED1C77), version(1.0), helpfile(\"Tax.hlp\"), helpstring(\"Tax ActiveX 控件模块\"), control ] library TaxLib { [ uuid(10F7C381-1316-439D-BAE6-8C3D2221185D), helpstring(\"Tax Control 的事件接口\") ] dispinterface _DTaxEvents { properties: // 事件接口没有任何属性 2 // CTaxCtrl 的事件调度接口 }; // CTaxCtrl 的主调度接口 importlib(STDOLE_TLB); [ uuid(CC389683-C147-490B-88DA-BF57022A615D), helpstring(\"Tax Control 的调度接口\")] dispinterface _DTax { properties: methods: UnR[id(DISPID_ABOUTBOX)] void AboutBox(); [id(1), helpstring(\"方法AddOne\")] LONG AddOne(LONG num); egistered }; [ uuid(D3C5CECF-26AA-46FD-945A-1D73C1DA06CC), helpstring(\"Tax Control\"), control ] coclass Tax { }; [default] dispinterface _DTax; [default, source] dispinterface _DTaxEvents; // CTaxCtrl 的类信息 }; methods: 这里要特别提醒一下,在控件使用的时候,需要一个控件编号,在TaxLib “DC2A37EC-649B-42E9-8243-4EA232ED1C77”,很多时候大家会使用这个号码作为控件编号, 控件处理函数在TaxCtrl.cpp文件中实现,代码如下: // TaxCtrl.cpp : CTaxCtrl ActiveX 控件类的实现。 #include \"stdafx.h\" #include \"Tax.h\" #include \"TaxCtrl.h\" #include \"TaxPropPage.h\" #ifdef _DEBUG #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(CTaxCtrl, COleControl) // 消息映射 BEGIN_MESSAGE_MAP(CTaxCtrl, COleControl) ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) END_MESSAGE_MAP() UnR eg3 “D3C5CECF-26AA-46FD-945A-1D73C1DA06CC”。 is这是不对的,对的号码是类信息中的号码,即最后一个号码 te属性中看到的uuid号码对应的是Tax.idl文件中出现的第一个号码 red // 调度映射 BEGIN_DISPATCH_MAP(CTaxCtrl, COleControl) DISP_FUNCTION_ID(CTaxCtrl, \"AboutBox\", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) DISP_FUNCTION_ID(CTaxCtrl, \"AddOne\", dispidAddOne, AddOne, VT_I4, VTS_I4) END_DISPATCH_MAP() // 事件映射 BEGIN_EVENT_MAP(CTaxCtrl, COleControl) END_EVENT_MAP() // 属性页 // TODO: 按需要添加更多属性页。请记住增加计数! BEGIN_PROPPAGEIDS(CTaxCtrl, 1) PROPPAGEID(CTaxPropPage::guid) END_PROPPAGEIDS(CTaxCtrl) // 初始化类工厂和guid IMPLEMENT_OLECREATE_EX(CTaxCtrl, \"TAX.TaxCtrl.1\", 0xd3c5cecf, 0x26aa, 0x46fd, 0x94, 0x5a, 0x1d, 0x73, 0xc1, 0xda, 0x6, 0xcc) // 键入库ID 和版本 IMPLEMENT_OLETYPELIB(CTaxCtrl, _tlid, _wVerMajor, _wVerMinor) // 接口ID const IID BASED_CODE IID_DTax = { 0xCC389683, 0xC147, 0x490B, { 0x88, 0xDA, 0xBF, 0x57, 0x2, 0x2A, 0x61, 0x5D } }; const IID BASED_CODE IID_DTaxEvents = { 0x10F7C381, 0x1316, 0x439D, { 0xBA, 0xE6, 0x8C, 0x3D, 0x22, 0x21, 0x18, 0x5D } }; // 控件类型信息 static const DWORD BASED_CODE _dwTaxOleMisc = OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST | UnR eg4 istered OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE; IMPLEMENT_OLECTLTYPE(CTaxCtrl, IDS_TAX, _dwTaxOleMisc) // CTaxCtrl::CTaxCtrlFactory::UpdateRegistry - // 添加或移除CTaxCtrl 的系统注册表项 BOOL CTaxCtrl::CTaxCtrlFactory::UpdateRegistry(BOOL bRegister) { // TODO: 验证您的控件是否符合单元模型线程处理规则。 // 有关更多信息,请参考MFC 技术说明64。 // 如果您的控件不符合单元模型规则,则 // 必须修改如下代码,将第六个参数从 // afxRegApartmentThreading 改为0。 if (bRegister) return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_TAX, IDB_TAX, afxRegApartmentThreading, _dwTaxOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } // CTaxCtrl::CTaxCtrl - 构造函数 CTaxCtrl::CTaxCtrl() { InitializeIIDs(&IID_DTax, &IID_DTaxEvents); // TODO: 在此初始化控件的实例数据。 } // CTaxCtrl::~CTaxCtrl - 析构函数 CTaxCtrl::~CTaxCtrl() UnR eg5 istered{ // TODO: 在此清理控件的实例数据。 } // CTaxCtrl::OnDraw - 绘图函数 void CTaxCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { if (!pdc) return; // TODO: 用您自己的绘图代码替换下面的代码。 pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->Ellipse(rcBounds); } // CTaxCtrl::DoPropExchange - 持久性支持 void CTaxCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); // TODO: 为每个持久的自定义属性调用PX_ 函数。 } // CTaxCtrl::OnResetState - 将控件重置为默认状态 void CTaxCtrl::OnResetState() { COleControl::OnResetState(); // 重置DoPropExchange 中找到的默认值 // TODO: 在此重置任意其他控件状态。 } // CTaxCtrl::AboutBox - 向用户显示“关于”框 void CTaxCtrl::AboutBox() { CDialog dlgAbout(IDD_ABOUTBOX_TAX); dlgAbout.DoModal(); } UnR eg6 istered // CTaxCtrl 消息处理程序 LONG CTaxCtrl::AddOne(LONG num) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码 return num+1; } 从代码中可以看出AboutBox函数会弹出一个关于的对话框,而AddOne则返 te可以使用VS2005自带的工具测试控件的功能,如下图所示。 reegis7 下图所示。 d回输入整数加1,代码编译后,如果没有出错,则可以得到控件Tax.ocx了,如 UnR 在测试容器中插入新控件,选择刚才编译好的控件(注意:编译好的控件自动会添加到测试容器中,开发人员不需要添加),如下图所示。 te控件的方法是否可以正常调用。如下图所示。 re出现一个椭圆形,表示控件已经装载,可以进行测试了。我们这里只是测试 UnReg 8 is在方法名下拉列表中,就是控件的两个调用方法,先调用AboutBox方法,这个方法不需要输入参数,直接点调用即可,效果如下图所示。 AddOne方法调用需要输入参数num,在参数位置输入整数3并点设置值,然后点调用,可以看到返回值是整数4,即函数执行成功,输入参数以及执行效果如下图所示。 d 通过控件容器测试,说明控件没有任何问题,下面就是控件的使用问题。 二、使用JavaScript调用ActiveX控件 有很多方法可以调用ActiveX控件,这里选择在JavaScript中调用ActiveX 编辑一个HTML文档,名字为t.html,编辑内容如下: UnR eg9 istere控件。 d这里特别提醒一下,classid号码要输入对,否则调用会因为找不到控件而失败。其他的含义比较简单,这里就不啰嗦了。 这里是在本地调用ActiveX控件,其他形式的调用,还需要对控件进行安全方面的一些处理,否则浏览器会禁止执行。 三、浏览器使用ActiveX控件 双击刚才编辑的x.html文档,缺省情况下,启动IE浏览器打开页面,会有一个报警,效果如下图所示。 reegis点击“执行函数”按钮,效果如下图所示。 允许启动控件,则可以点击“执行函数”和“关于”按钮了。 te d UnR 点击“关于”按钮,效果如下图所示。 10 因篇幅问题不能全部显示,请点此查看更多更全内容