浏览器插件之ActiveX开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浏览器插件之ActiveX开发
浏浏器件之插 ActiveX 浏浏;一,
一般的Web浏用浏于浏浏器件能不使用的建浏量不使用~因浏其涉及到安全浏浏以及影用浏插尽响
安;或自浏下浏注安,浏浏浏。

在有特殊需求;如涉及据安全的金融浏浏据交互、需件装册装体数数插
才能浏浏的本地浏浏的交互等,的情下可以酌情用。

与况慎
浏浏器件浏可以分浏大浏浏~插体划两即IE支持的件以及非插IE支持的件。

本在插来
Netscape浏代~浏于浏浏器件是有公用的浏范的插(NPAPI)~一浏始所有浏浏器都支持浏浏范~包括IE。

后出于商浏原因~微浏的来IE不再支持NPAPI~改而自己浏浏了一套基于COM的ActiveX体个体系~但浏系浏于非IE浏浏器是拒浏支持的。

所以目前的基本是~状况IE浏浏器浏支持ActiveX控件~而Firefox、Chrome等浏浏器只支持一浏接口;另XPCOM或NPAPI,。

要想浏浏一个Web插件~至少需要同浏考浏IE支持的AceiveX版以及非IE支持的Plugin版;Flash等件浏插于IE与非IE浏浏器都是不同的,。

ActiveX的浏浏可以用C#、VB及C++等浏言。

用C++浏浏ActiveX既可以使用ATL~也可以使用MFC。

ATL ActiveX浏出文件浏小~适合浏浏浏~但浏浏浏浏度稍大~而网MFC ActiveX浏出文件稍大;附浏必要的MFC dll,~但易于上手。

本文主要介浏基于MFC的ActiveX浏浏。

一、浏建浏目及添加接口
在 2008中~新建一个MFC ActiveX Control浏目,
点浏“OK”后浏出如下浏浏,将框
依次点浏“Next”按浏直到“Control Settings”浏浏浏:
由于本例子只演示浏提供函接口不基于界面的数ActiveX~故“Create control based
on”浏浏“;none,”可。

点浏即"Finish”按浏~完成了浏目的浏建~文件浏如下,即构
右浏浏目名~浏浏“称Properties”~在浏目性浏浏中浏“属框All Configurations”浏行配置。

在“Configurations Properties->General”浏浏浏中~“Use of MFC”浏浏“Use MFC in a static
Library”~以便浏浏浏将MFC相浏浏自浏和控件一起打包。

浏于“Character Set”的浏浏根据具情体况而定~浏注意“Unicode Character Set”和“Mulity-Byte Character SEt”浏字符浏理是完全不一浏的;字符浏浏不一浏~需要浏行MultiByteToWideChar或WideCharToMultiByte浏浏,。

注意,浏建MFC ActiveX Control浏已浏自浏浏浏目添加了.def文件做好了相浏浏浏。

若浏配置信息更改后浏并
致浏浏的ocx注不成功或提示不到册找EntryPoint~可以浏浏一下Linker-
>Input的Module Definition File是否配置正~正常情下已浏自浏配置好了~如下浏,确况
接下就可以在来ActiveX中添加我浏需要外部交互的接口方法和性了。

浏浏“与属Class
View”~右浏“MyTestActiveXLib->_DMyTestActiveX”~在浏出的菜浏中可以浏浏Add
Function或Add Property来属添加接口方法或接口性,
浏里以定浏一个LONG AddFun(LONG num1,LONG num2) 的接口函浏例~添加数Menthod如下浏所示,
点浏Finish后~可在“即MyT estActiveXCtrl.cpp”文件到浏添加的接口函代浏,找数
在函中完成自定浏的浏浏浏浏可。

数体即
二、浏浏安全接口
上述浏目浏浏后可生成即ocx文件~浏ocx即可嵌入html在IE中行。

但如果浏运ocx浏浏浏面是放在浏的真web服浏器上~浏浏浏浏面浏行ActiveX里浏浏接口浏IE将会属提示“无相浏性,需要浏置其初始化和脚本行的安全性”等信息。

浏是因浏运ActiveX要在浏程IE上浏行~需要浏浏安全接口。

有浏控件的初始化和脚本安全浏浏~《再浏 IObjectSafety》一文及其引用的Microsoft文章做了浏浏致描述。

浏于ATL写的ActiveX~浏浏IObjectSafety即可~浏里有ATL浏浏安全接口的浏浏的描述。

浏于MFC写的ActiveX~可以通浏修改注表的方式浏浏控件的安全性~微浏也提供的册来浏浏
的文描述档。

具浏浏步浏如下,体
1、首先在浏目中添加Cathelp.h和Cathelp.cpp两个内文件~其容如下所示。

Cathelp.h
#include "comcat.h"
// Helper function to create a component category and associated// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);
// Helper function to register a CLSID as belonging to a component// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);
Cathelp.cpp
#include "stdafx.h"
#include "comcat.h"
#include "strsafe.h"
#include "objsafe.h"
// HRESULT CreateComponentCategory - Used to register ActiveX control as safe
HRESULT CreateComponentCategory(CATID catid, WCHAR *catDescription) {
ICatRegister *pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR\Component Categories\{..catid...}
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english
size_t len;
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
// The second parameter of StringCchLength is the maximum
// number of characters that may be read into catDescription.
// There must be room for a NULL-terminator. The third parameter // contains the number of characters excluding the NULL-terminator.
hr = StringCchLength(catDescription, STRSAFE_MAX_CCH, &len);
if (SUCCEEDED(hr))
{
if (len>127)
{
len = 127;
}
}
else
{
// TODO: Write an error handler;
}
// The second parameter of StringCchCopy is 128 because you need // room for a NULL-terminator.
hr = StringCchCopy(catinfo.szDescription, len + 1, catDescription);
// Make sure the description is null terminated.
catinfo.szDescription[len + 1] = '\0';
hr = pcr->RegisterCategories(1, &catinfo);
pcr->Release();
return hr;
}
// HRESULT RegisterCLSIDInCategory -
// Register your component categories information HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid){
// Register your component categories information.
ICatRegister *pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid){ ICatRegister *pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
注,Cathelp.cpp中的代浏是基于Unicode Character Set的。

故浏目配置浏若改成Multi-Byte Character Set~需浏Cathelp.cpp中代浏做相浏修改~否浏浏浏不浏~
2、在MyTestActiveX.cpp文件中~添加CLSID_SafeItem的定浏,
CLSID_SafeItem的浏是根据xxxCtrl.cpp;本例中是MyTestActiveXCtrl.cpp,文件中IMPLEMENT_OLECREATE_EX的定浏而的;浏浏上就是来ActiveX的CLASSID,。

本例中MyTestActiveXCtrl.cpp文件中IMPLEMENT_OLECREATE_EX的的浏如下,
“将0x1345c26b, 0xe979, 0x45a5, 0x99, 0x7d, 0x94, 0x27, 0xfb, 0x81, 0xe7, 0x7”浏浏的在适位置添加“当{”和“}”括弧浏成了即
CLSID_SafeItem的浏
“0x1345c26b, 0xe979, 0x45a5, {0x99, 0x7d, 0x94, 0x27, 0xfb, 0x81,
0xe7, 0x7}”。

外~另MyTestActiveX.cpp文件起始浏浏需要引入如下文件方能正常浏浏,两

3、修改MyTestActiveX.cpp中DllRegisterServer和DllUnregisterServer
函数~代浏如下;照抄可,,即
// DllRegisterServer - Adds entries to the system registrySTDAPI DllRegisterServer(void)
{
HRESULT hr; // HResult used by Safety Functions
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
// Mark the control as safe for initializing.
hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");
if (FAILED(hr))
return hr;
hr = RegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// Mark the control as safe for scripting.
hr = CreateComponentCategory(CATID_SafeForScripting,
L"Controls safely scriptable!");
if (FAILED(hr))
return hr;
hr = RegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForScripting);
if (FAILED(hr))
return hr;
return NOERROR;
}
// DllUnregisterServer - Removes entries from the system registry STDAPI DllUnregisterServer(void)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
// 浏除控件初始化安全入口.
HRESULT hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// 浏除控件脚本安全入口
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
注, 多例子里很DllUnregisterServer的法本文的法不一致~浏果浏致浏控件
浏写与写卸
(regsvr32 /u xxxx.ocx)出浏“浏用某某ocx文件的DllUnregisterServer函
出浏~浏浏代浏,数0x80070002”浏浏。

究其根源~是DllUnregisterServer中浏
除注表的浏序出了浏浏~册
“ waxgourd0 的浏浏”中有篇文章浏此做了浏描述。


4、在解方案下点浏浏源文件;决Resources->MyTestActiveX.rc,~点浏右浏在浏出的菜浏中浏浏“View Code”~浏浏浏源文件信息保以下浏目的正性,并确几个确
a) BLOCK的浏浏“040904e4”
b) OLESelfRegister的浏浏“\0”
c) VarFileInfo中的Translation后浏浏浏“0x0409, 1252”
到目前浏止~可以浏浏浏目~浏出的ocx控件是可以正常行的了。

运~~~浏浏器件之插ActiveX浏浏;二,
按照上文《浏浏器插件之ActiveX浏浏,一,》的,能一个基于步浏浏浏浏浏浏浏MFC的的浏浏浏ActiveX控件。

不在操作中是会遇到一些。

由于浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏COM浏程了解得很少很少,有些浏浏我也没有找到很好的解决方法。

一、ActiveX需要引用其他dll的浏浏
浏浏我的ActiveX需要浏IC卡行写,所以需要用自的接口浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏“厂商提供了mwhrf_bj.lib”、“mwhrf_bj.dll”和“mwrf32.h”等接口文件。

将“mwhrf_bj.lib”和“mwrf32.h”添加到目中,浏浏浏浏ActiveX的接口方法中就可以用接口文浏浏浏浏浏件中的方法了。

但是在会出浏浏浏浏浏浏“Project:error PRJ0050:未能注册出。

启用浏浏浏浏浏浏浏浏
“浏每个用的重定向浏”浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏,或用提升限从命令提示窗口中注册件”“或Project : error PRJ0050:
Failed to register output. Please ensure you have the appropriate permissions to
modify the registry”的。

浏浏浏
浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏上不是出在段,而是出在注册后的ocx文件。

浏浏 2008默浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏在成功后会自注册后的ocx文件。

右目名称,浏浏浏浏浏浏浏浏“Properties”,在浏出框的浏浏浏浏“Configurations Properties->Linker->General”中的Register Output就可以配置后是否自注册浏浏浏浏浏浏浏浏浏ocx,如下所示:浏浏浏浏
之所以注册ocx浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏“出,是因注册找不到被用的mwhrf_bj.dll”文件。

将被用的浏浏浏“mwhrf_bj.dll”文件放在ocx文件相同目下或者其他浏浏浏浏浏浏%PATH%路径下,如Windows文件或浏浏System32文件等,,注册浏浏浏浏浏浏浏ocx浏浏浏浏浏不会。

在浏浏浏境中可以直
接将要被用的外部浏浏浏浏浏dll文件copy到Debug或Release目下即可,也可以在浏浏浏浏浏浏浏浏浏PreBuild脚本里将外部dll文件COPY到目文件,如:浏浏浏浏浏浏浏浏浏浏
注:可参考
“;文章。

二、ActiveX的方法浏浏浏浏
在 2008下可以浏ActiveX按如下方式行:浏浏浏浏浏
1、准好浏浏Demo.html文件并写好程序,面中需通浏浏浏浏浏浏浏浏浏浏浏浏<object />来引用需的浏浏浏ocx控件,于如何在浏浏浏浏浏html浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏面中用控件在后文章将提及,。

2、在 2008中右目名称,浏浏浏浏浏浏浏浏“Properties”,在出框中的浏浏浏浏浏Debugging配置里配置好浏浏浏浏浏Command和CommandArgs参数: Command: 本地IE浏浏“器的路径,如C:\Program Files\Internet
Explorer\IEXPLORE.EXE”
Command Args: 已建好的用于浏浏浏浏浏浏浏浏浏ocx的html文件路径,如上面提及的Demo.html文件路径,
3、在程序中需的地方置断点。

按浏浏浏浏浏浏浏浏浏浏浏F5运行后
将自启浏浏浏IE并打的浏浏浏浏html浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏文件,在断点会中断运行入状。

三、ActiveX的接口浏浏out/ref参数及返回自定构体数据的浏浏浏浏浏浏浏浏浏
浏浏有候ActiveX的接口方法只返回一个数据并不能足我的要求。

例如通浏浏浏浏浏浏浏浏浏浏浏浏浏浏ActiveX的getPersons()方法返回一堆的人信息,那必定是一个列表或数,而且浏浏浏浏浏浏浏个每Person浏包含姓名、性等各信息,个候返回就相当了。

浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏了起,是已通ActiveX浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏行卡号来例。

一般情况下,只要插件提供以下接口即可足需求:浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏
BSTR ReadCardNo();
浏浏在javascript中用浏浏浏ActiveX的ReadCardNo()方法即可返回一个包含卡号的字符串。

浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏但是,提供个接口如何来卡程中出的异常呢,
如果卡操作一切正常,返回一个卡号字符串当然没有。

浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏
但如果卡程中出如卡未正确接、卡无法等情况浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏
如果将些异常信息反用者呢,浏浏浏浏浏浏浏浏浏浏浏浏浏浏
1、首先我想到的是使用ref或out参数来解决,浏浏C++里是OUT/RETVAL之的参数浏浏浏浏修符。

浏浏浏
在.idl中定接口:浏浏浏浏浏
[id(1), helpstring("方法ReadCardNo")] LONG GetSheetName([out]BSTR* cardNo);
浏浏浏浏接口原型:
LONG ReadCardNo( BSTR* cardNo );
浏浏浏浏浏的通LONG浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏型的返回来返回状,例如可以定:
0-浏卡成功
1-浏浏浏浏浏浏卡未接
2-未找到可的卡浏浏浏浏
……
浏浏如果返回0,表示卡成功,出的卡号已通浏浏浏浏浏浏浏浏浏浏浏浏浏out 浏型的参数cardNo浏浏浏浏用者。

但是,javascript等脚本言并不支持浏浏浏浏浏浏out/ref等型的参数,函数参数浏浏浏浏浏浏浏浏浏浏也无法址,所以个方案无法解决我的。

浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏
2、如果ActiveX的接口能返回一个自定的构体型数据就能足我浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏的需求了。

例如我定一个构体:浏浏浏浏浏浏浏浏浏typedef struct
{
LONG ResultStatus, // 返回状态 0-态卡成功 1-态态态态态态卡未接3-未找到可的卡态态态态
BSTR CardNo // 态态态态态态态态态态卡成功,保存取的卡号
} AOPResult;
浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏接口如果可以按如下子来就可以解决我的了:
AOPResult ReadCardNo();
但是,在MFC ACtiveX的接口定中中不能直接使用自定的数据型的,需要用浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏VARIANT浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏型来行。

下面几篇参考文章均此有所描述:
a)
b)
c)
COM-ATL
d) 浏准MFC WinSock ActiveX控件例浏浏浏浏(II)高篇浏浏
浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏但起来也不是那容易,于及我需求的不
迫切性,我此没有做多。

如果有成型例,望教。

浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏
3、既然在Web浏浏浏浏用景下ActiveX的接口一般都是供js浏浏浏浏浏浏浏浏浏浏用,那我可以返回一个json浏“型的数据即可,如{ status:0,
cardNo:234234344634 }”。

浏浏ActiveX接口仍然只需返回一个BSTR的参数,只是返回的意了,不是的卡号,而需要浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏ActiveX的ReadCardNo接口在内部理需要将返回封装成一个浏浏浏浏浏浏浏浏浏浏浏浏浏浏json格式的字符串返回并交由用浏浏方解析。

不,在封装浏浏浏浏浏json字符串需要浏浏浏浏{、}、:等特殊字符行相理。

浏浏浏浏浏浏浏
4、于的用景,我也完全可以利用浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏ActiveX的属性来化解此。

例如浏浏浏浏浏浏我在浏浏ActiveX中定一个属性浏浏浏浏浏CardNo,的提供的接口只用的返浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏回一个状即可:浏浏浏浏
LONG ReadCardNo()
浏浏浏浏浏浏浏浏浏接口返回仍然表示状,如0表示卡成功,浏浏浏浏浏1表示未找到卡等等。

当返回浏浏浏浏浏浏浏浏浏浏0浏,浏浏浏浏浏浏浏浏浏卡成功,的卡号从属性CardNo中取即可。

浏浏浏浏浏
浏浏器件之插 ActiveX 浏浏;三,
ActiveX插件如果想在Html中浏行引用~必浏先浏件插ocx文件浏行注~通浏册即regsvr32将册两来达个浏控件注到用浏的操作系浏里。

在浏浏浏用中~一般有浏方式到浏目的,
一、通浏安程序注装册ActiveX
浏浏方式非常直浏~就是制作一浏浏的安程序~浏安程序的任浏就是打包的个装装将ocx文件及其依浏文件解浏浏制到系浏目浏位置~然后再通浏浏行
regsvr32命令已浏制到用浏机器目浏位置的将
ocx文件注到系浏中。

册当web浏面中需要浏用相浏的ActiveX浏~在浏著位置提示用浏需下浏指定将
的程序行安。

并运装
浏浏多浏用程序在安浏都浏含地向系浏注了一些很装册ActiveX的~例如QQ、浏信、播放器等~浏浏相浏的web就更加活。

不浏~不是所有的灵并ActiveX插件都是以ocx文件呈浏的~也可以是dll文件。

二、通浏cab包由IE自浏注册
能否在web浏面需要引用ActiveX浏由IE自浏下浏浏浏的件自浏安,然可以。

我浏插并装呢当
要做的就是要将ocx及其他文件打包成一个cab文件~然后浏将cab文件放在web服浏器上~并在web浏面中通浏<object …..
codebase=”xxx.cab#version=1,0,0,1” />的方式浏行浏用。

cab浏浏上是微浏浏定的一特殊格式的浏浏文件~制作个cab包浏程浏浏,很
1、准浏cabarc.exe工具~浏工具可以在浏里下浏~也可以微浏从下浏~
2、将ocx文件及依浏的其他文件放到同一目浏下~在浏目浏下浏建一后浏浏个并个.inf的文件;文件名可任意取~一般与ocx文件同名~例如MyTestActiveX.inf,~文件容如下,内[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
MyTestActiveX.ocx=MyTestActiveX.ocx
mwhrf_bj.dll = mwhrf_bj.dll
[MyTestActiveX.ocx]
file=thiscab
clsid={1345C26B-E979-45A5-997D-9427FB81E707}
FileVersion=1,0,0,1
RegisterServer=yes
DestDir=11
[mwhrf_bj.dll]
file=thiscab
FileVersion=1,0,0,0
DestDir=10
a) signature="$CHICAGO$"表示浏个.INF文件和Windows95或其后版本和Windows NT 4.0或其后的版本兼容。

b) [Add.Code]下面的容用于定浏浏内cab需要下浏的各文件浏浏的定浏浏~左浏浏文件名~区等右浏浏定浏域名~一般浏易浏均定浏的域名文件名相同。

号区将区与
c) 各文件的定浏域分浏定浏了浏文件的各浏性区属:
file,表示浏文件的浏取位置~此浏thiscab表示浏文件就包含在浏cab中~如果在其他位置而不在cab包中~浏可以上具的位置如写体
clsid, 只有需要注的册ocx文件才浏置浏性~他的浏就是改个属ocx的唯一classid~可以浏目的从.idl文件中最下方浏~找
FileVersion,文件版本。

号一般将ocx文件的版本浏同浏整号个cab的版本~号在<object codebase=”xx.cab#version=1,0,0,1”中用到浏版本将号。

DestDir,浏文件需要COPY到目浏机器的位置~11表示system32目浏下~10表示windows目浏下~……
有浏inf文件的具容可考以下文章相浏部分~已浏非常浏浏了,体内参
OCX 控件 CAB 打包手及升浏方法册
INF 文件的浏法解浏
浏建 CAB 文件
VC2005 从浏浏 MFC ActiveX ocx 控件到浏布到 .net 网站的全部浏程
注,如果考浏到浏端用浏的浏限以及将ActiveX注到什浏位置;册Current User 或Machine,~可考参
Non-Admin ActiveX Controls
3、行如下命令浏行打包,运
cabarc" -s 6144 N "xxxxxx.cab" "xxxxx.ocx" "mwhrf_bj.dll"
"xxxxxx.inf"
其中凡是需要打包的文件均要一一列出~inf文件放在最后;未浏浏是否必浏最后,。

文件路径径径均可以是浏浏路或相浏路~不一定非得是相同文件浏下。

命令浏行后自浏生成将.cab文件。

浏浏器件之插 ActiveX 浏浏; 四,
浏浏浏浏一下前篇文章的容~《几内浏浏器件之插 ActiveX 浏浏;一, 》浏浏介浏了一下如何在 2008下用C++浏浏基于MFC的ActiveX插件~《浏浏器件之插 ActiveX 浏浏;二, 》介浏了浏浏件浏可能插遇到的浏浏~《浏浏器件之插 ActiveX 浏浏;三, 》介浏了如何注件以及如册插何打包成cab文件。

但是~到目前浏止浏有浏浏提及如没何在Web浏面中浏用件~本文主要浏浏浏浏浏浏行插个展浏。

一、用<Object>浏浏浏用ActiveX
1、Object浏浏基本用法
在Html浏面中浏用ActiveX插件最浏浏常用的方法是,
<object id="CardAccessor"
classid="clsid:03AD53E8-D7E7-485D-A39A-D07B37DEFBC9"
width="0"
height="0">
</object>
id属性就不用解浏了~和html中其他元素的id一浏~是DOM浏中各元素的唯一浏浏。

width和height表示浏ActiveX在Web浏面中占位的大小~浏于浏提供接口无UI界面的ActiveX来浏将其浏置浏0即内可~因浏不需要在浏面上浏示任何容;浏于需要浏示界面的ActiveX~需要在浏目里浏建Dialog及相浏浏浏~可以考“写参A Complete ActiveX Web Control Tutorial”浏例 ,。

classid属个属性在浏里是一非常浏浏的性~IE正是通浏他才能正到要浏用的确找ActiveX的。

每个ActiveX均有一唯一的个id来表示~浏就是classid~在我浏浏建MFC ActiveX Control浏目浏 2008就我浏生成了浏帮个id, 可以在程序的.idl文件最下方到浏找个ID浏,
一般不建浏手浏修改程序中的浏个uuid浏~因浏在xxxxCtrl.cpp文件中也用到了浏个id浏~只是表浏形式不一浏浏了,
控件注成功后~浏册个classid及控件文件位置等信息均入注表了~如下所示,写册
然~如果当ActiveX浏定浏了其他性~也可以在属<object>中以性的属形式浏他浏浏浏。

如果用浏的浏算机已浏注了浏件;例如通浏册插Setup.exe方式,~那浏Html
引用上段代浏后就可以通浏js浏用件的接口和性了;插属再次提示一下~ActiveX 只能在IE浏浏器行~也就运是<object…>浏段代浏在firefox等其他浏浏器是不能正常工作的,。

<fieldset>
<legend>Read Card No Testing</legend>
,卡号<input type="text" id="txtCardNo_Read" maxlength="32"
class="txt disable" readonly />
<input type="button" id="btnRead" value=" Read CardNo " class="btn" onclick="javascript:readCardNo();" />
</fieldset>
<fieldset>
<legend>Write Card No Testing</legend>
,卡号<input type="text" id="txtCardNo_Write" maxlength="32"
class="txt" />
<input type="button" id="btnWrite" value=" Write CardNo "
class="btn" onclick="javascript:writeCardNo();" />
</fieldset>
<script type="text/javascript">
var txtCardNo_Read = document.getElementById("txtCardNo_Read");
var txtCardNo_Write = document.getElementById("txtCardNo_Write");
var objCard = document.getElementById("CardAccessor");
function readCardNo() {
txtCardNo_Read.value = "";
try{
var ret = objCard.ReadCardNo();
if (ret == 0) {
txtCardNo_Read.value = objCard.CardNo;
alert("浏成功卡,");
}
else {
alert("浏卡失浏,浏浏浏浏," + ret); }
}
catch (e) {
alert(e.message)
}
}
function writeCardNo() {
var cardNo = txtCardNo_Write.value; try {
objCard.CardNo = cardNo;
var ret = objCard.WriteCardNo();
if (ret == 0) {
alert("写卡成功,");
}
else {
alert("写卡失浏,浏浏浏浏," + ret); }
}
catch (e) {
alert(e.message)
}
}
</script>
2、使用Object浏浏浏如何判断ActiveX是否已注册<script
type="text/javascript">
var objCard = document.getElementById("CardAccessor");
if (objCard.object==null) {
alert("CardAccessor插装件未安,");
}
else{
alert("已浏浏到CardAccessor插件,");
}
</script>
外也可以通浏浏浏另ActiveX中的某已个属来断插装知已定浏的性判件是否已安~如果返
回的性浏浏属undefined~浏表示有浏浏到件。

例如,没插
<script type="text/javascript">
var objCard = document.getElementById("CardAccessor");
if (objCard.CardNo==undefinedl) {
alert("CardAccessor插装件未安,");
}
else{
alert("已浏浏到CardAccessor插件,");
}
</script>
3、如何浏IE自浏下浏安件装插并智能升浏
如果浏浏到件有安~浏浏插没装怎IE自浏指定位置下浏件自浏安,浏浏~在从插并装呢很object浏浏中使用codebase属即性可,
<object id="CardAccessor"
classid="clsid:03AD53E8-D7E7-485D-A39A-D07B37DEFBC9"
codebase="CardAccessor.cab#version=1,0,0,1"
width="0"
height="0">
</object>
codebase的浏格式浏“xxxxx.cab#version=1,0,0,1”。

'#'前面部分浏cab文件的位置~可以是在服浏器上的浏浏位置~也可以是相浏位置。

'#‘后面部分表示前引用的当cab包的版本。

号当IE浏浏到系浏有注指定件~便没册插从codebase 指定的位置下浏浏cab到本地~按照其并中.inf文件的描述各文件浏制到指定位置注指定的控件。

;将并册注,在浏浏浏用中涉及浏名浏浏~后文再述, 使本地已浏注了浏件~即册插IE浏将册号与拿已注的控件版本codebase中指定的版本相号比浏~如果codebase中指定的版本大于已注件的版本~号册插号IE 仍然会从codebase指定位置下浏cab包并册插重新注浏浏件。

正如前面的文章所提~浏方便管理~一般将cab包中需注的册ocx文件的版本浏同号cab版本。


件或件依浏的文件需要升浏浏~只需更新相浏的文件~浏当插插并.inf中的相浏文件版本升浏(浏方便管理~无浏是否更新了ocx文件~浏ocx文件的版本也号跟着升浏~因浏其版本代表了整号个cab)~然后重新打包成cab浏布到服浏器上
~更新并html中object浏浏中codebase属性浏的version部分版本。

用浏下次浏浏浏浏面浏~号当IE将自浏下浏升浏后的cab并册插重新注件。

浏浏上~浏浏我的浏浏~及浏服浏器上的cab包不做任何浏化~只要增加codebase中version 的浏~浏浏件均插会册重新下浏和注。

二、通浏javascript的new ActiveXObject来浏用ActiveX
如果不使用object浏浏~也可以直接通浏js的ActiveXObject来浏建指定ActiveX的浏例从达插而到浏用件接口的目的;IE下xmlhttpRequest的浏用就是浏原理,。

例如,个
var objCard = new ActiveXObject("Uprain.CardAccessorCtrl.1");
如果件已浏注~接下就可以通浏插册来objCard来插属浏用件接口和浏浏性了。

ActiveXObject函的浏浏浏浏件的数参数插ProgId而非CLASSID。

在浏目中xxxxCtrl.cpp文件中同浏可以到或修改浏浏件的找插ProgId浏~如下浏,
即IMPLEMENT_OLECREATE_EX的第二就表示前件的参数当插ProgId~浏浏可以根据浏浏需要自行修改。

浏浏上~在注表中通浏册ProgId是可以到浏浏的找ClassId的~两者是有浏浏的,
那浏如何判断ActiveX是否已浏安,浏浏上如果装呢ActiveX未安~通浏装new ActiveXObject的方式浏建件浏来插会象是抛出“Automation 服浏器不能浏建浏象”常的。

所异以用如下方式可,即
try {
objCard = new ActiveXObject("Uprain.CardAccessorCtrl.1");
}
catch (e) {
alert("浏用ActiveX失浏,");
}
不浏~我在浏浏浏浏浏程中遇到浏情,两况
1, 出浏“Automation 服浏器不能浏建浏象”常的不一定就表示件安~也有可异并插没装
能是因件插从未浏浏初始化或脚本安全接口~而被IE浏截~需要浏整IE“工具-浏浏-安全-自定浏浏浏”中“ActiveX控件和件”部分的浏置~插2, 有浏候~同浏已注的件~通浏册插object浏浏引用的方式能正常浏用接口~但通浏new ActiveXObject的方式浏浏用件接口插失浏。

浏浏器件之插ActiveX浏浏;五,
前面四篇文章都是在描述如何用C++浏浏基于MFC的ActiveX插件以及如果插件浏浏浏浏行打包和在Web浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏面中用,但确忽略了一个非常重要的:代名。

《浏浏器插件之ActiveX浏浏,三,》提及了两注册插件的方法,其中浏浏浏浏浏浏浏浏浏浏浏IE自下并注册插件的浏浏浏浏浏浏浏浏浏方法就及到名,如果涉浏浏浏浏浏浏浏cab包是未名的或名不被信浏浏浏浏浏浏浏浏浏浏浏浏任的,IE就拒浏浏浏浏浏浏浏注册插件。

浏浏浏浏一、数字名述
浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏在的各件星密布、混,用在使用件程序一定。

相关文档
最新文档