网站收录检测,服装网站建设策划书预期投入,房地产怎么做网站推广,生物科技 网站模板目录
一、用C MFC ActiveX开发简单的ocx控件
二、在C#程序中调用ocx控件
三、在Web页面中调用已实现的ocx控件
四、OCX、COM的区别以及C、C#和VB开发的组件的区别
1.什么是OCX#xff1f;
2.OCX、COM的区别以及C、C#和VB开发的组件的区别#xff1f;
3.C#开发COM组件需…目录
一、用C MFC ActiveX开发简单的ocx控件
二、在C#程序中调用ocx控件
三、在Web页面中调用已实现的ocx控件
四、OCX、COM的区别以及C、C#和VB开发的组件的区别
1.什么是OCX
2.OCX、COM的区别以及C、C#和VB开发的组件的区别
3.C#开发COM组件需要选择的项目
4.开发结束后对外开放的接口如何提供给HTML使用
5.MFC OCX控件实现安全初始化和脚本安全的方法
6.查看ocx或dll文件依赖项列表的方法 一、用C MFC ActiveX开发简单的ocx控件
本文给出了在Visual Studio 2010开发环境下使用向导工具生成一个简单ocx控件的示例。 首先以管理员身份运行Visual Studio 2010这样做的目的是在将来编译控件时VS2010能自动注册ocx控件不会出现权限不足导致失败的错误。如果不使用管理员身份运行VS 2010将来就需要使用regsvr32命令手动注册创建的ocx控件注意执行regsvr32命令时也要使用管理员身份即以管理员身份执行cmd.exe然后在命令行窗口中执行regsvr32命令。在“起始页”中点击“新建项目”就会弹出对话框如下图所示 将要创建一个做乘法运算的ocx控件于是给项目起名叫MultiplyDemo点击”确定“按钮接下来向导显示如下 接下来都采用默认设置连续点击”下一步“按钮显示依次如下 这里勾选了“运行时不可见”和”有‘关于’对话框“这两项点击”完成“按钮将会自动创建相关的文件。完成后切换到”类视图“展开MultiplyDemoLib这一项在下属的_DMultiplyDemo这一项上点击鼠标右键在弹出菜单选项中点击”添加方法“如下图 在”添加方法向导“对话框中方法名设为”Multiply“返回类型在下拉列表中选中LONG。在“参数类型”下拉列表中选择LONG“参数名”输入框中输入Num1点“添加”按钮添加一个参数Num1再按同样方法添加参数Num2如下图 点击“下一步”按钮显示如下 不修改默认设置点击“完成”按钮。接下来按CtrlF快捷键搜索Multiply定位到MultiplyDemoCtrl.cpp文件中Multiply(LONG Num1, LONG Num2)方法的定义部分如下图 修改Multiply( )函数的定义改为如下 即该函数的返回值是两个输入参数Num1与Num2的乘积。 在“解决方案资源管理器”窗口中在MultiplyDemo这一项上点击鼠标右键点击“生成”选项如下图 完成之后到程序所在目录下可以看到创建了MultiplyDemo.ocx文件如下图 可以使用COMRaider工具软件网址https://github.com/dzzie/COMRaider查看一下生成的ocx文件显示如下 可以看到在MultiplyDemo.ocx控件中包含了一个名为Multiply的方法。 二、在C#程序中调用ocx控件
在本文中给出一个C#示例程序调用上一篇博文中创建的MultiplyDemo.ocx控件。注意需要保证该控件已经注册过。 启动Visual Studio 2010使用C#创建一个Windows窗体程序如下图 点击“确定”按钮之后就自动创建了项目和相关文件如下图 从工具箱中向窗体上拖拽5个Label控件Text属性值分别为“计算两个整数的乘积”、“整数1”、“整数2、“乘积”注意最后一个Label控件Lable5的Text属性值为空将来会用它显示乘积。从工具箱中向窗体上拖拽两个Button控件Text属性值分别为“计算乘积”、“退出”。从工具箱中向窗体上拖拽两个TextBox控件分别放在Label“整数1”、“整数2”的右侧。在“解决方案资源管理器”子窗口中在“引用”这一项上点击鼠标右键在弹出选项中点击“添加引用”如下图所示 在弹出的对话框中选择在上一篇博文中创建的控件MultiplyDemoLib如下图 点击“确定”按钮。 接下来按CtrlAltx组合键调出“工具箱”子窗口在子窗口中点击鼠标右键在弹出菜单中选择“选择项”如下图 在弹出对话框中的“COM组件”标签页中选中创建的MultiplyDemo Control点击“确定”按钮如下图 将会发现在“工具箱”子窗口中的“常规”项目下面多出来一项MultiplyDemo Control如下图 点击“工具箱”中的MultiplyDemo Control将它拖拽到窗体上如下图 为两个Button控件填写Click事件处理代码如下图 按F5键执行程序显示如下 在两个TextBox中输入数字点击“计算乘积”按钮即可看到乘积的值如下图 点击“退出”按钮即可退出程序。 ocx控件中还包含了AboutBox( )方法为了调用该方法可以往窗体上再拖拽一个Button控件Text属性值设为“显示控件自带对话框”。该Button的Click事件处理代码如下 执行程序点击“显示控件自带对话框”按钮如下图 显示结果如下 三、在Web页面中调用已实现的ocx控件
打开在博文http://blog.csdn.net/henter/article/details/79399986 中创建的 MultiplyDemo 项目在“解决方案资源管理器”窗口中双击 MultiplyDemo.idl 文件在该文件中找到“CMultiplyDemoCtrl 的类信息”这一段内容将其中的uuid后面括号中的内容保存下来后面将会用到。如下图 写一个名为index.html的文件内容如下
!DOCTYPE htmlhtmlbodyOBJECT idMultiplyDemo classidclsid:526453C4-2FC0-4196-99BC-3B0D223BE780 width0 height0/OBJECTh1调用乘法控件演示页面/h1p请输入数字/ppx input idnum1 typetext/ppy input idnum2 typetext/pp idproductText结果将显示在这里....../pscriptfunction computProduct(){var num01document.getElementById(num1).value;if (num01 || isNaN(num01)){alert(输入错误不是整数)return;}var num02document.getElementById(num2).value;if (num02 || isNaN(num02)){alert(输入错误不是整数)return;}var multiplyOcxdocument.getElementById(MultiplyDemo)if (multiplyOcx){var productResult multiplyOcx.Multiply(num01, num02);document.getElementById(productText).innerHTML num01.toString() * num02.toString() productResult.toString();}else{alert(控件不存在);}}function showOcxAboutBox(){var multiplyOcxdocument.getElementById(MultiplyDemo)if (multiplyOcx){multiplyOcx.AboutBox();}else{alert(控件不存在);}}/scriptbutton typebutton οnclickcomputProduct()计算乘积/buttonp/pbutton typebutton οnclickshowOcxAboutBox()显示控件自带的对话框/button/body/html 注意 html 文件中的 classidclsid:526453C4-2FC0-4196-99BC-3B0D223BE780 这里用到了前面保存的 uuid 值。 将 index.html 和 MultiplyDemo.ocx 文件放到同一个目录下使用IE打开保存在本机磁盘上的 index.html 文件显示如下 点击下方的“允许阻止的内容”将弹出如下对话框 点击“是”按钮后页面显示如下 在输入框中分别输入两个整数值点击“计算乘积”按钮页面显示类似下图 如果点击“显示控件自带的对话框”按钮页面显示如下 如果html文件调用ocx文件失败可以从以下方面查找原因
1ocx控件是否已被注册过
2系统中是否包括一些必要的库文件比如VS 2010相关的动态库。为了减轻对库文件的依赖在编译ocx控件时可以按下图设置 这样编译出来的ocx文件的体积虽然会增大一些但是可以减轻对库文件的依赖。 上面介绍了在本地磁盘上的html文件中调用已实现的ocx控件接下来将index.html文件放到Web服务器上。为了简单这里使用一个轻量级的Web服务器软件 Abyss Web Server X1其官网地址是 http://aprelium.com/abyssws/ 。安装该软件后将index.html 和 MultiplyDemo.ocx 这两个文件拷贝到 \Abyss Web Server\htdocs 目录下启动 IE 浏览器将 http://localhost 添加到受信任的站点如下图所示 在“开始”菜单中点击 Abyss Web Server X1 软件图标启动该 Web 服务器如下图 打开 IE 浏览器输入网址http://localhost/index.html 显示如下 在输入框中随意分别输入两个整数值点击“计算乘积”按钮及点击“显示控件自带的对话框”按钮页面显示如下 如果不将 http://localhost 添加到 IE 的受信任站点使用 IE 浏览器时在“Internet选项”-“高级”中如果勾选了“禁用脚本调试Internet Explorer”那么点击网页上的按钮时将无任何反应。如果取消了对“禁用脚本调试Internet Explorer”的勾选如下图 点击网页上的按钮时会出现如下错误提示 导致这个错误的原因是在编程实现ocx控件时没有相关的安全接口因此IE阻止了对该控件的调用。对于实现安全接口的方法可以参考以下链接 https://support.microsoft.com/en-us/help/161873/how-to-mark-mfc-activex-controls-as-safe-for-scripting-and-initializat http://www.cnblogs.com/qguohog/archive/2013/01/22/2871805.html 这里介绍一下实现过程。首先以管理员身份启动VS 2010打开项目 MultiplyDemo在“解决方案资源管理器”窗口中在“头文件”下添加一个名为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 ; // englishsize_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 (len127){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;
} 在“解决方案资源管理器”子窗口中双击“源文件”下面的 MultiplyDemoCtrl.cpp打开该文件后找到下面的内容 将以下内容记录下来 // 初始化类工厂和 guid IMPLEMENT_OLECREATE_EX(CMultiplyDemoCtrl, MULTIPLYDEMO.MultiplyDemoCtrl.1, 0x526453c4, 0x2fc0, 0x4196, 0x99, 0xbc, 0x3b, 0xd, 0x22, 0x3b, 0xe7, 0x80) 在“解决方案资源管理器”子窗口中双击“源文件”下面的 MultiplyDemo.cpp打开该文件编写下面一段代码 const CATID CLSID_SafeItem {0x526453c4, 0x2fc0, 0x4196,{0x99, 0xbc, 0x3b, 0xd, 0x22, 0x3b, 0xe7, 0x80}}; 注意花括号中的数值来源于刚才复制的内容并加以修改即前三个值不变后面8个值再放入到一个花括号中。将这一段代码粘贴到 MultiplyDemoCtrl.cpp 文件中 CMultiplyDemoApp theApp; 这一行后面如下图 在 MultiplyDemo.cpp 文件起始处加入下面两行代码
#include Cathelp.h
#include objsafe.h
如下图 在 MultiplyDemo.cpp 文件中找到 DllRegisterServer( ) 和 DllUnregisterServer( )两个函数删除它们。粘贴下面的代码
// DllRegisterServer - Adds entries to the system registrySTDAPI DllRegisterServer(void)
{HRESULT hr; // HResult used by Safety FunctionsAFX_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, LControls 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, LControls 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 registrySTDAPI DllUnregisterServer(void)
{AFX_MANAGE_STATE(_afxModuleAddrThis); // 删除控件初始化安全入口. HRESULT hrUnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing); if (FAILED(hr)) return hr; // 删除控件脚本安全入口 hrUnRegisterCLSIDInCategory(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;
} 在“解决方案资源管理器”子窗口中右键单击“资源文件”下面的 MultiplyDemo.rc在弹出菜单中选择“查看代码”如下图所示 找到“BLOCK StringFileInfo”这一行从这一行开始向下看 1将BLOCK的值设为040904e4 2将OLESelfRegister的值设为\0
3Translation后面改为0x0409, 1252。修改如下图所示 重新生成 MultiplyDemo.ocx 等文件。将该文件拷贝到 Abyss Web Server X1 服务器软件的 \Abyss Web Server\htdocs 目录下覆盖原有的同名文件。重启一下 Abyss Web Server X1 服务器软件启动 IE 浏览器输入网址http://localhost/index.html 注意当前未将 http://localhost 加入 IE 的受信任站点在页面上的输入框中分别随意输入两个整数点击“计算乘积”按钮及点击“显示控件自带的对话框”按钮页面显示如下 此时点击网页上的按钮能够执行对应的功能。 建议如果有条件的话最好对 MultiplyDemo.ocx 文件进行数字签名。
四、OCX、COM的区别以及C、C#和VB开发的组件的区别
参考关于C#开发OCX组件的说明_zms19841230的博客-CSDN博客_c# ocx
1.什么是OCX
OCX是指用C、C#或者VB开发的COM组件对外开放的接口可提供和html进行调用解决html调用本地电脑资源或者第三方集成的问题。应用场景包括银行、视频播放用flash也能解决相关问题等。
2.OCX、COM的区别以及C、C#和VB开发的组件的区别
对于HTML调用的组件来说OCX和COM没有任何区别用C和VB开发可以生成OCX或COM组件但是用C#只能生成COM组件。
C#是微软的产物所以其生成的COM组件目前只能提供给IE使用
OCX同样支持IE但是在也可以开发出非IE内核使用
3.C#开发COM组件需要选择的项目
对于windows开发而言实质上开发COM就是开发DLL选择C#开发基本上都是使用Virual Studio我使用的是VS2008.NET版本是3.5新建项目选择类库即可。
4.开发结束后对外开放的接口如何提供给HTML使用
想要使DLL能为COM组件在程序里需要对AssemblyInfo.csAndroid开发同事可以将其理解为Android里面的AndroidManifest.xml文件添加[assembly: Guid(151e5c23-d121-4f26-a035-7a43f6d775b0)]表示此项目向COM公开GUID用于类型库
在开放接口类里面实现IObjectSafety接口实现代码不用改网上都是一样的直接拿过来就行
最后在你的开放接口类外部添加自定义GUID这是最关键的一步[GuidAttribute(1A585C4D-3371-48dc-AF8A-AFFECC1B0967)]这个GUID需要自己生成HTML的开发者在集成安装你提供的COM组件后需要知道你的GUID才能正常使用你提供的接口
HTML里面先加载COM组件注意这里对于HTML而言不关注OCX或者COM里调用方法一样objectidYouOcxclassidclsid:FD05F7D5-BA6A-4d6a-9F79-DFADB79BA2B0/object 这里的classid就是你开发COM组件所 使用的GUID然后在html里面就可以使用该对象了varocx document.getElementById(YouOcx );
ocx.XXX();,这里的XXX()就是你COM所提供给HTML调用的方法。
5.MFC OCX控件实现安全初始化和脚本安全的方法 两种方法 方法1通过IObjectSafety接口实现推荐 方法2通过代码修改注册表实现 参考添加IObjectSafety接口使MFC写的OCX可信_smilingc_开发小记-CSDN博客
感谢此篇博客。找了很久没有找到IObjectSafety需要添加哪些代码这篇代码很详细。MFC OCX控件实现安全初始化和脚本安全的方法
原文有两个方法我更推荐用IObjectSafety原博客的代码不太好看我这里整理一下。 我的环境是VS2013用模板生成的项目包含的文件基本相同不构成影响。一般如下结构
假定我们用模板生成的项目名叫[TestOCX]所以马赛克部分应该都是TestOCX。相应的本文涉及的两个文件分别为TestOCXCtrl.h和TestOCXCtrl.cpp。 如果需要则请将代码中的TestOCXCtrl替换成各位自己的名字。
在TestOCXCtrl.h中添加如下代码
#include objsafe.h // for IObjectSafety; in ActiveX SDK
这个代码是实现IObjectSafety的前提。
依然是在TestOCXCtrl.h中一般在类的构造函数前有一行
DECLARE_DYNCREATE(CTestOCXCtrl)
在这行代码前添加如下代码 #pragma region objsafe
//*******************************************************add begin//ISafeObjectDECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (/* [in] */ REFIID riid,/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions);STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (/* [in] */ REFIID riid,/* [in] */ DWORD dwOptionSetMask,/* [in] */ DWORD dwEnabledOptions);END_INTERFACE_PART(ObjSafe);//ISafeObject
//*******************************************************add end#pragma endregion
加上#pragma region objsafe只是因为方便折叠…
在TestOCXCtrl.cpp中注意替换下述代码中所有CTestOCXCtrl为自己控件的名称。需要添加的有几个位置 (1)消息映射内添加如下代码
BEGIN_MESSAGE_MAP(CTestOCXCtrl, COleControl)//下面是要添加的//{{AFX_MSG_MAP(CTestOCXCtrl)// NOTE - ClassWizard will add and remove message map entries// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSG_MAPON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)//添加结束
END_MESSAGE_MAP()
(2)紧跟其后如果没有接口映射的话下述代码完整添加否则添加到接口映射内即可
//*******************************************************add begin
BEGIN_INTERFACE_MAP(CTestOCXCtrl, COleControl)INTERFACE_PART(CTestOCXCtrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()
//*******************************************************add end
(3)在文件末尾完整复制粘贴如下代码
增加IObjectSafety接口实现方法
***************************************************************add begin// IObjectSafety member functions// Delegate AddRef, Release, QueryInterfaceULONG FAR EXPORT CTestOCXCtrl::XObjSafe::AddRef(){METHOD_PROLOGUE(CTestOCXCtrl, ObjSafe)return pThis-ExternalAddRef();}ULONG FAR EXPORT CTestOCXCtrl::XObjSafe::Release(){METHOD_PROLOGUE(CTestOCXCtrl, ObjSafe)return pThis-ExternalRelease();}HRESULT FAR EXPORT CTestOCXCtrl::XObjSafe::QueryInterface(REFIID iid, void FAR* FAR* ppvObj){METHOD_PROLOGUE(CTestOCXCtrl, ObjSafe)return (HRESULT)pThis-ExternalQueryInterface(iid, ppvObj);}const DWORD dwSupportedBits INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;const DWORD dwNotSupportedBits ~ dwSupportedBits;//.............................................................................// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions// Allows container to query what interfaces are safe for what. Were// optimizing significantly by ignoring which interface the caller is// asking for.HRESULT STDMETHODCALLTYPE CTestOCXCtrl::XObjSafe::GetInterfaceSafetyOptions( /* [in] */ REFIID riid,/* [out] */ DWORD __RPC_FAR *pdwSupportedOptions,/* [out] */ DWORD __RPC_FAR *pdwEnabledOptions){METHOD_PROLOGUE(CTestOCXCtrl, ObjSafe)HRESULT retval ResultFromScode(S_OK);// does interface exist? IUnknown FAR* punkInterface; retval pThis-ExternalQueryInterface(riid, (void * *)punkInterface);if (retval ! E_NOINTERFACE) { // interface exists punkInterface-Release(); // release it--just checking!}// we support both kinds of safety and have always both set,// regardless of interface*pdwSupportedOptions *pdwEnabledOptions dwSupportedBits;return retval; // E_NOINTERFACE if QI failed}/
// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions
// Since were always safe, this is a no-brainer--but we do check to make
// sure the interface requested exists and that the options were asked to
// set exist and are set on (we dont support unsafe mode).HRESULT STDMETHODCALLTYPE
CTestOCXCtrl::XObjSafe::SetInterfaceSafetyOptions(/* [in] */ REFIID riid,/* [in] */ DWORD dwOptionSetMask,/* [in] */ DWORD dwEnabledOptions){METHOD_PROLOGUE(CTestOCXCtrl, ObjSafe)// does interface exist? IUnknown FAR* punkInterface; pThis-ExternalQueryInterface(riid, (void * *)punkInterface); if (punkInterface) { // interface exists punkInterface-Release(); // release it--just checking! } else { // interface doesnt exist return ResultFromScode(E_NOINTERFACE); } // cant set bits we dont support if (dwOptionSetMask dwNotSupportedBits) { return ResultFromScode(E_FAIL); } // cant set bits we do support to zero dwEnabledOptions dwSupportedBits; // (we already know there are no extra bits in mask ) if ((dwOptionSetMask dwEnabledOptions) !dwOptionSetMask) { return ResultFromScode(E_FAIL); } // dont need to change anything since were always safe return ResultFromScode(S_OK);
}//***************************************************************add end
完成上述步骤之后编译在HTML中添加
!-- saved from url(0017)http://localhost/ --
应该就不会弹出安全警告了。 当然此警告也可通过手动修改IE-安全设置 暂时屏蔽但不建议。 6.查看ocx或dll文件依赖项列表的方法
使用vs2010命令提示工具输入命令: dumpbin /dependents [文件完整路径]