浏览器插件之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浏浏。一、浏建浏目及添加接口
在Vs.net 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后~可在“即MyTestActiveXCtrl.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文件。浏浏Vs.net 2008默浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏在成功后会自注册后的ocx文件。右目名称,浏浏浏浏浏浏浏浏“Properties”,在浏出框的浏浏浏浏“Configurations Properties->Linker->General”中的Register Output就可以配置后是否自注册浏浏浏浏浏浏浏浏浏ocx,如下所示:浏浏浏浏
之所以注册ocx浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏“出,是因注册找不到被用的mwhrf_bj.dll”文件。将被用的浏浏浏“mwhrf_bj.dll”文件放在ocx文件相同目下或者其他浏浏浏浏浏浏%PATH%路径下,如Windows文件或浏浏System32文件等,,注册浏浏浏浏浏浏浏ocx浏浏浏浏浏不会。在vs.net浏浏浏境中可以直接将要被用的外部浏浏浏浏浏dll文件copy到Debug或Release目下即可,也可以在浏浏浏浏浏浏浏浏浏PreBuild脚本里将外部dll文件COPY到目文件,如:浏浏浏浏浏浏浏浏浏浏
注:可参考
“;文章。
二、ActiveX的方法浏浏浏浏
在Vs.net 2008下可以浏ActiveX按如下方式行:浏浏浏浏浏
1、准好浏浏Demo.html文件并写好程序,面中需通浏浏浏浏浏浏浏浏浏浏浏浏
来引用需的浏浏浏ocx控件,于如何在浏浏浏浏浏html浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏浏面中用控件在后文章将提及,。
2、在vs.net 2008中右目名称,浏浏浏浏浏浏浏浏“Properties”,在出框中的浏浏浏浏浏Debugging配置里配置好浏浏浏浏浏Command和CommandArgs参数:
Command: 本地IE浏浏“器的路径,如C:\Program Files\Internet
Explorer\IEXPLORE.EXE”
Command Args: 已建好的用于浏浏浏浏浏浏浏浏浏ocx的html文件路径,如上面提及的Demo.html文件路径,
3、在程序中需的地方置断点。按浏浏浏浏浏浏浏浏浏浏浏F5运行后vs.net将自启浏浏浏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浏面中通浏
的方式浏行浏用。
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的版本~号在