3VC 编写ACTIVEX控件和CSHARP调用ACTIVEX
Authorware案例教程-第11章 ActiveX控件

11.2
ActiveX控件简介
2、ActiveX控件的安装与注册
如果要使自己创建的 ActiveX 控件或其它人提供的控件 能在 Authorware 中被正确使用,首先要将控件文件 (*.OCX)复制到硬盘中,然后将其在Windows中注册, 方法有以下两种:
①手工注册: “开始”→“运行”命令,输入“regsvr32 <控件的文 件名>”命令。
②自动注册
11.2
ActiveX控件简介
3、ActiveX控件的使用方法
实例1 制作视频播放器 ;
实例2 WEB浏览器制作;
1函数功能执行部必须通过容 器,因此 ActiveX 控件和容器之间必须有一些特定的 接口协议。Activex控件必须具备如下的性能: 属性和方法:Activex控件必须提供属件的名称、方法的 名称及对应参数。通过这项功能,容器可以存取和改 变ActiveX控件的属性参数,调用ActiveX控件的方法 对控件功能进行控制。 事件: Activex控件由这项功能通知容器在 ActiveX控件 中发生的事件,例如属性参数的改变、用户双击鼠标 等。
11.1
引例
• 利用Windows Media Player提供的 ActiveX控 件播放视频文件。 要求掌握的知识: (1)ActiveX的基本知识; (2)ActiveX控件的具体应用; (3)巧将ActiveX控件、交互图标综合应用。
11.2
ActiveX控件简介
1、ActiveX控件概述 ActiveX 是 Microsoft 的 元 素 软 件 标 准 。 简 单 地 说 , ActiveX技术是一种共享程序数据和功能的技术。 其设计思想将一个程序嵌入到另一个程序中(即所说的 容器)。借助这种技术可以使用户在一个程序中所创 建的文件(如 web 网页)插入到另一个应用程序(如 a7p文件)中运行,大大扩展了其它应用程序的功能。
海康威视开发ActiveX控件接口说明(V2.3)

海康威视ActiveX控件接口说明V2.3版本(20100611)控件版本更新说明:1.版本号改为2.3.9.12.增加接口:BMPCapturePicV23、JPEGCapturePicV23、StartRecordV233.支持第三方IPC的添加20100115更新:1.增加添加数字通道时获取第三方IPC协议的接口2.增加GetServerIPByIPServer接口通过IP-SERVER模式获取IP地址接口20100405更新:1.GetServerInfo接口中增加获取零通道个数的节点2.增加零通道相关接口,开始零通道预览、停止零通道预览、零通道预览画面翻页20100510更新:1.GetIPCConfig和SetDigitChannel接口增加是否启用快速添加节点。
用于95NVR2.增加通过SADP获取在线IPC信息列表接口:GetIPCInfoBySadp3.增加修改SADP获取的在线IPC信息接口:SetIPCameraInfo方法:1.注册1.1 注册long Login(LPCTSTR lpServerIP, long lPort, LPCTSTR lpUserName, LPCTSTR lpPassword)功能:注册用户到硬盘录像机参数说明:lpServer IP:硬盘录像机的IP地址lPort:硬盘录像机端口号lpUserName:登陆的用户名lpPassword:登陆的密码返回值:lUserID提供给其他接口使用。
-1表示注册失败。
1.2 设置UserIDBOOL SetUserID(long lUserID)功能:设置UserID,如果注册成功,可以通过该接口传入UserID.参数说明:lUserID:要传入的UserID值返回值:TRUE表示成功,FALSE表示失败。
2.注销2.1 注销BOOL Logout()功能:从硬盘录像机上注销某个用户返回值:TRUE表示成功,FALSE表示失败。
VB程序设计第10章 ActiveX控件简介

Logo
12.工具栏上的按钮如打开,保存和打印等,其相应的图 标在何处可以得到? 答:可以在VB的Graphics\BITMAPS\TLBR_W95目录下找 到工具按钮位图。
13.如何知道点击TreeView的+号所选中的目录 答:这种情况应该在Expand事件中获得节点。在TreeView 控件中的Node对象扩展开时, 也就是它的子节点变成可 视时,这个事件便发生。Expand事件发生在Click和 DblClick事 件之后。语法是: Private Sub object_Expand(ByVal node As Node) 其中参数node是所需要要获得的节点。
Company Logo
Logo
7.如何在StatusBar控件中增加一个变量并将该 变量值显示在状态栏里? 答:将StatusBar的Style属性为sbrSimple,即: StatusBar1.SimpleText =cy (其中cy为变量名)。 如果Style属性为sbrNormal,可以这样: Set pnlX = StatusBar1.Panels.Add pnlX.Text =cy „改变面板对象的文本
答:可以使用下面的语句加入一个按钮,叫bold: Set btnX = Toolbar1.Buttons.Add(, "bold", , tbrCheck, "bold") 然后检查Toolbar1.Buttons("bold").Value的值, 如果该值为tbrUnpressed,表示按钮 没 有被按下, 如果为tbrPressed表示被按下。检查工作通常是 在toolbar1_ButtonClick事件中完成的 。
客户端管理控件安装_巧用ActiveX控件实现Web程序中的客户端硬件操作

《客户端管理控件安装_巧用ActiveX控件实现Web程序中的客户端硬件操作》摘要:摘要:B/S模式是应用广泛的一种软件体系结构,ActiveX控件开发完成以后就可以嵌入在网页中使用了,ActiveX控件解决了网页程序无法操作客户端硬件的问题,拓宽了Web程序的应用领域摘要:B/S模式是应用广泛的一种软件体系结构。
本文针对如何在这种架构的Web程序中运用ActiveX控件实现客户端硬件操作进行了一些探讨,给出了一个可行的解决方案。
关键字:B/S模式 Web程序客户端硬件操作 ActiveX控件一、引言目前,网络版应用软件的开发模式主要有“客户/服务器”(Client/Server,简称C/S)模式和“浏览器/服务器”(Browser/Server,简称B/S)模式。
C/S模式的应用程序分为客户端和服务器端两部分,可以充分利用两端硬件优势,降低系统通信开销。
但这种模式也有不足之处,软件需要分别在客户机和服务器上进行安装,增加了部署和维护的开销。
随着软件和网络的发展,浏览器的功能越来越强大,B/S模式的Web程序逐渐兴起和成熟。
在这种结构下,用户界面完全可以通过浏览器实现,软件的一部分事务逻辑在前端实现,但主要事务逻辑在服务器端实现,客户通过浏览器与服务器端软件进行交互并得到结果。
这种结构不仅节约了开发成本,并且部署和维护只在服务器端进行,降低了开销。
然而这种模式也有不足之处,如客户端只能通过脚本做一些简单的交互而无法直接控制硬件。
笔者日前参与开发了一款基于触摸屏的自助系统,采用的就是B/S模式。
由于该系统需要在自助终端上实现读写磁卡、收币和找零等功能,需要对读卡器、纸币器等多种硬件设备进行操作。
为此,笔者对于如何在Web程序中实现客户端的硬件操作进行了一些研究,最终运用ActiveX控件解决了这个问题。
二、ActiveX控件ActiveX控件是一种可重用的软件组件,可以很快地在网页和桌面应用程序中加入特殊的功能。
C#中调用OCX控件

一、C#中调用OCX控件调用OCX控件的步骤:1、在系统中注册该ocx控件,命令:regsvr32.exe 控件位置(加 /u 参数是取消注册)2、在.net的工具箱中添加该控件,拖到form中去就可以了。
不用工具箱的话,自己手工添加,需要注意一个问题,就是要用Aximp.exe来包装一下ocx控件的类,然后再程序中引用生成的dll就可以了。
aximp [options]{file.dll | file.ocx}The following command generates MediaPlayer.dll and AxMediaPlayer.dll for the Media Player control msdxm.ocx.aximp c:\systemroot\system32\msdxm.ocxActiveX 控件导入程序将 ActiveX 控件的 COM 类型库中的类型定义转换为 Windows 窗体控件。
Windows 窗体只能承载 Windows 窗体控件,即从 Control 派生的类。
Aximp.exe 生成可承载于 Windows 窗体上的 ActiveX 控件的包装类。
这使您得以使用可应用于其他 Windows 窗体控件的同一设计时支持和编程方法论。
若要承载 ActiveX 控件,必须生成从 AxHost 派生的包装控件。
此包装控件包含基础 ActiveX 控件的一个实例。
它知道如何与 ActiveX 控件通信,但它显示为 Windows 窗体控件。
这个生成的控件承载 ActiveX 控件并将其属性、方法和事件公开为生成控件的属性、方法和事件。
如果不包装一下直接用,会出现灾难性错误。
上面已经说明了原因。
在项目中引用生成的ax开头的dll,在窗体代码中增加:声明一个公有的控件对象:public AxISPICRECLib.AxISPICREC AxISPICREC;在InitializeComponent()方法内初始化控件:AxISPICREC = new AxISPICRECLib.AxISPICREC();//必须new对象,否则窗体设计器出问题((ponentModel.ISupportInitialize)(this.AxISPICREC)).BeginInit();//初始化开始this.Controls.Add(this.AxISPICREC);//添加控件((ponentModel.ISupportInitialize)(this.AxISPICREC)).EndInit();this.AxISPICREC.OcxState =((System.Windows.Forms.AxHost.State)(resources.GetObject("AxISPICREC.OcxState")));//设计控件状态如果遇到“正试图在 os 加载程序锁内执行托管代码”这个错误,请设置“调试”--“异常”"----"Managed Debugging Assistants"中勾掉"LoaderLock" 就可以了。
在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗

在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗在EOS6的项⽬中,如果采⽤VC++开发的ActiveX,那么第⼀次运⾏的时候,IE中就会提⽰,“在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗?”在⽹上找了很多资料,原理介绍的多,但是真正如何做,介绍的⽐较少,因此这⾥把实际的步骤⼀步⼀步的记录下来了,供⼤家参考。
1.1 去除ActiveX访问时的安全提⽰当ActiveX第⼀次被访问时,会出现如下提⽰框:这是IE浏览器的安全机制造成的,我们可以采⽤下⾯的步骤来去除这个提⽰信息:1.1.1 在CDemoCtl的头⽂件.h中增加对objsave的引⽤#include <objsafe.h>1.1.2 在其protected声明区增加如下内容://去掉安全警告 BEGINDECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety)STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions);STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions);END_INTERFACE_PART(ObjectSafety)//去掉安全警告 END1.1.3 在CDemoCtl的实现类.cpp的IMPLEMENT_DYNCREATE(CActivexFirstCtrl, COleControl)这⼀⾏后增加如下内容://去掉安全警告 BEGINBEGIN_INTERFACE_MAP(CDemoCtl, COleControl)INTERFACE_PART(CDemoCtl, IID_IObjectSafety, ObjectSafety)END_INTERFACE_MAP()// Implementation of IObjectSafetySTDMETHODIMP CDemoCtl::XObjectSafety::GetInterfaceSafetyOptions(REFIID riid,DWORD __RPC_FAR *pdwSupportedOptions,DWORD __RPC_FAR *pdwEnabledOptions){METHOD_PROLOGUE_EX(CDemoCtl, ObjectSafety)if (!pdwSupportedOptions || !pdwEnabledOptions){return E_POINTER;}*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER| INTERFACESAFE_FOR_UNTRUSTED_DATA;*pdwEnabledOptions = 0;if (NULL == pThis->GetInterface(&riid)){TRACE("Requested interface is not supported.\n");return E_NOINTERFACE;}// What interface is being checked out anyhow?OLECHAR szGUID[39];int i = StringFromGUID2(riid, szGUID, 39);if (riid == IID_IDispatch){// Client wants to know if object is safe for scripting*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;return S_OK;}else if (riid == IID_IPersistPropertyBag|| riid == IID_IPersistStreamInit|| riid == IID_IPersistStorage|| riid == IID_IPersistMemory){// Those are the persistence interfaces COleControl derived controls support// as indicated in AFXCTL.H// Client wants to know if object is safe for initializing from persistent data*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;return S_OK;}else{// Find out what interface this is, and decide what options to enableTRACE("We didn"t account for the safety of this interface, and it"s one we support...\n");return E_NOINTERFACE;}}STDMETHODIMP CDemoCtl::XObjectSafety::SetInterfaceSafetyOptions(REFIID riid,DWORD dwOptionSetMask,DWORD dwEnabledOptions){METHOD_PROLOGUE_EX(CDemoCtl, ObjectSafety)OLECHAR szGUID[39];// What is this interface anyway?// We can do a quick lookup in the registry under HKEY_CLASSES_ROOT\Interfaceint i = StringFromGUID2(riid, szGUID, 39);if (0 == dwOptionSetMask && 0 == dwEnabledOptions){// the control certainly supports NO requests through the specified interface// so it"s safe to return S_OK even if the interface isn"t supported.return S_OK;}// Do we support the specified interface?if (NULL == pThis->GetInterface(&riid)){TRACE1("%s is not support.\n", szGUID);return E_FAIL;}if (riid == IID_IDispatch){TRACE("Client asking if it"s safe to call through IDispatch.\n");TRACE("In other words, is the control safe for scripting?\n");if (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask&& INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions){return S_OK;}else{return E_FAIL;}}else if (riid == IID_IPersistPropertyBag|| riid == IID_IPersistStreamInit|| riid == IID_IPersistStorage|| riid == IID_IPersistMemory){TRACE("Client asking if it"s safe to call through IPersist*.\n");TRACE("In other words, is the control safe for initializing from persistent data?\n");if (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask&& INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions){return NOERROR;}else{return E_FAIL;}}else{TRACE1("We didn"t account for the safety of %s, and it"s one we support...\n", szGUID); return E_FAIL;}}STDMETHODIMP_(ULONG) CDemoCtl::XObjectSafety::AddRef(){METHOD_PROLOGUE_EX_(CDemoCtl, ObjectSafety)return (ULONG)pThis->ExternalAddRef();}STDMETHODIMP_(ULONG) CDemoCtl::XObjectSafety::Release(){METHOD_PROLOGUE_EX_(CDemoCtl, ObjectSafety)return (ULONG)pThis->ExternalRelease();}STDMETHODIMP CDemoCtl::XObjectSafety::QueryInterface(REFIID iid, LPVOID* ppvObj){METHOD_PROLOGUE_EX_(CDemoCtl, ObjectSafety)return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);}//去掉安全警告 END。
vb6.0 ActiveX控件
ADO Data 控件ADO Data 控件与内部Data 控件以及Remote Data控件(RDC) 相似。
ADO Data 控件使您能使用Microsoft ActiveX Data Objects (ADO) 快速地创建一个到数据库的连接。
说明在设计时,您可以通过首先将ConnectionString 属性设置为一个有效的连接字符串,然后将RecordSource属性设置为一个适合于数据库管理者的语句来创建一个连接。
您也可以将ConnectionString属性设置为定义连接的文件名。
该文件是由“数据链接”对话框产生的,当您单击“属性”窗口中的ConnectionString,然后单击“生成”或“选择”时,该对话框出现。
您可以通过将DataSource 属性设置为ADO Data 控件,把ADO Data 控件连接到一个数据绑定的控件,例如DataGrid、DataCombo、或DataList 控件。
在运行时,您可以动态地设置ConnectionString和RecordSource 属性来更改数据库。
或者,您可以将Recordset 属性直接设置为一个原先已经打开的记录集。
Animation 控件Animation 控件允许创建按钮,当单击它时即显示动画,如 .avi 文件。
该控件只能播放无声的 AVI 文件。
此外,动画控件只能显示未压缩的或已用行程编码(RLE) 压缩的 .avi 文件。
说明如果尝试加载含有声音数据或格式不为控件所支持的 .avi 文件,则返回错误(错误 35752)。
在 Windows 95 中,文件复制进度栏就是使用Animation 控件的一个实例。
在执行复制操作时,纸页从一个文件夹“飞”到另一个文件夹。
CommonDialog 控件CommonDialog 控件提供一组标准的操作对话框,进行诸如打开和保存文件,设置打印选项,以及选择颜色和字体等操作。
通过运行 Windows 帮助引擎控件还能显示帮助。
提示一个或多个activex控件无法显示的解决方法
提示一个或多个ActiveX控件无法显示的解决方法原因可能是下列其中之一:1)当前安全设置禁止运行此页面中的ActiveX控件;2)您已经阻止了其中一个控件的发布者。
因此,该页面可能无法显示。
解决方法1:可能是你禁用了每个服务。
运行,输入msconfig,服务选项卡里面启用active有关服务。
若是找不到,在一般选项卡启动选择,选加载所有服务项那个,重启即可若是上面方法无效可以尝试系统还原,选用合适的还原点。
解决方法2:打开注册表编辑器,定位到:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentV er sion\Internet Settings\Zones\0解决方法3:详细请看下文1什么是ActiveX控件?2ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。
3如果我没有安装控件会有什么现象?4为了保障您账户的安全,如果您使用的是IE浏览器,我们会自动提示您安装。
如果没有正确安装,会出现如下图所示的情况:5这时候您只要按照我们的提示,下载安装我们的安全控件并刷新,就可以正常使用了。
6如何自动安装控件?7如果您使用的是windows xp系统(sp2),IE浏览器会屏蔽上面的弹出窗口,这时候您只要按照下面的步骤安装就可以了:8第一步:登录交易系统时,IE窗口会出现下图所示的提示,此时点击“单击此处”提醒:请不要关闭此提示框,否则,您就不能正常安装我们的插件了!9第二步:选择“安装ActiveX控件”:提醒:选择并点击“安装ActiveX控件”,我们保证选择此控件对您的计算机没有任何风险!10第三步:弹出如下图所示安全警告窗口,选择“安装”如果您的网络忙,安装可能会花几分钟时间,请稍等片刻!完成后您就可以登录交易系统了。
11如何手动安装控件?12您也可以点下载软件包进行控件安装:(注:点此下载WINRAR)13第一步:鼠标右键点击软件包进行解压。
Qt ActiveX开发、调用、调试(带附件)
Qt ActiveX创建、调用和调试1.创建并设置工程vs2008新建Qt ActiveX工程:下一步默认选择,加载Core library、GUI library、ActiveQt server library,默认下一步,finish.设置工程的属性:属性->配置属性->调试命令:在用浏览器测试ocx的时候用得到,建议填写IE的绝对路径;命令参数:填写嵌入你的ocx的html的绝对路径。
2.在第一部设置好后,随便写几个信号和槽链接,生成一个dll组件(Active 控件可使ocx或dll,我这里是dll),将生成的dll用depends工具查看该dll的所有依赖项,将所有的依赖项拷贝到当前目录,编写ActiveX控件注册脚本,将regsvr32.exe ActiveXTest.dll 重命名为reg.cmd放在生成目录下,双击此文件等待注册成功:我的生成目录:3.编写html脚本嵌入ocx如果ocx想要通过IE浏览器调用,则必须编写html脚本掉用控件,通常的例子如下,保持你的html路径与你在设置工程时的路径一致。
<html><head><title>Test page for WebCall ActiveX</title></head><body><objectID="ActiveXTest"CLASSID="CLSID:64A09A02-D01F-46D4-A597-EF106A4FADC5"width="100%" height="100%" codebase="ActiveXTest.dll#version=1.0.0"> </object></body></html>重名名为scricp.html4.调试ActiveX控件一般调试ActiveX控件有两种方式:通过IE调试,通过编写测试程序调用Activex调试。
ActiveX控件cab包制作教程
Web ActiveX控件制作Web ActiveX控件制作 (1)1. 制作ActiveX控件的工具 (2)2. ActiveX控件制作步骤 (3)2.1. 制作数字证书 (3)2.2. 制作cab包 (4)2.2.1. 制作xx.inf文件 (4)2.2.2. 制作cab包 (5)2.3. 制作有数字签名的ActiveX控件 (5)3. 界面运行情况 (12)3.1. 安装数字证书 (12)3.2. 安装控件 (14)1.制作ActiveX控件的工具下载工具包:/upload/signtool.rar,解压至根目录(最好是根目录,方便后边敲路径),我的路径是E:\delphi\signtool\制作ActiveX控件需要用到的工具如下:制作cab包的工具制作数字证书工具在控件上签署数字签名的工具2.ActiveX控件制作步骤2.1. 制作数字证书在cmd下或者“运行”中输入以下命令:这里的printocx.pvk是我新创建的私人密钥;CN=KeHong Company是持有人或者颁发者,你可以CN=XX公司;最后的printocx.cer则是新建的证书。
根据提示在弹出的窗口输入私钥密码(因为做这个证书的目的并不是为了安全,所以密码建议设成123456之类好记的):执行结束后,在目录下会生成两个文件:printocx.pvk、printocx.cer。
证书的制作就是这么简单。
2.2. 制作cab包2.2.1.制作xx.inf文件Test.inf文件是用于之后的控件打包压缩。
例如cab包共需要打包的文件有:ClientOCX.ocxDllDeinterlace.dllmsvcp71.dllTest.inf文件内容如下:; INF file for HD_Viewer.cab[version]signature="$CHICAGO$"AdvancedINF=2.0; 以上部分不要修改[Add.Code]ClientOCX.ocx= ClientOCX.ocxDllDeinterlace.dll= DllDeinterlace.dllmsvcp71.dll= msvcp71.dll[ClientOCX.ocx]file-win32-x86=thiscabclsid={AC69DFDB-D959-4B9A-9F30-8A2160051C12}DestDir=11FileVersion=1,0,0,1RegisterServer=yes[DllDeinterlace.dll]file-win32-x86=thiscabDestDir=11FileVersion=1,1,0,3RegisterServer=yes[msvcp71.dll]file-win32-x86=thiscabDestDir=11FileVersion= 8,0,50727,762RegisterServer=yes; end of INF file注:INF文件具体配置可在网络搜索或见/immc1979/article/details/1572222 2.2.2.制作cab包创建cab包在cmd下或者“运行”中输入以下命令:cabarc.exe -s 6144 N print.cab msvcp71.dll DllDeinterlace.dll ClientOCX.ocx Test.inf 6144表示预留数字签名的空间print.cab表示生成的cab包名称msvcp71.dll DllDeinterlace.dll ClientOCX.ocx 表示需要打包的文件Test.inf为创建的控件打包压缩初始化文件运行该命令后,系统在当前窗口生成一个print.cab压缩包2.3. 制作有数字签名的ActiveX控件下面我们来对自己做的ocx控件签名(我的控件是print.cab),双击目录里的signcode.exe文件,出现了数字签名向导:选择控件包print.cab:下一步,签名选项选“自定义”下一步,选择证书,点击“从文件选择”,这里要把默认类型换成X.509证书:下一步,选择私钥,即刚才生成的printocx.pvk文件:会提示输入密码,即上面你设置的密码,比如之前我建议你设的123456:下一步,算法选择sha1即可:下一步,默认不用管:下一步,数据描述,这里要认真写一下了,最后客户的IE浏览器提示的文件描述就是这里所填的:下一步,时间戳也不用理会,直接下一步完成:最后会再次提示输入私钥,输入你设置的密码123456,确定,即提示“数字签名向导已完成”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++编写ActiveX控件和C#调用调用ActiveX控件ActiveX这门技术是通过生成“*.ocx”文件来实现的。先来了解下OCX文件,在百度百科上面对OCX是这样解释的:“.ocx是ocx控件的扩展名,OCX是对象类别扩充组件。如果你用过VisualBasic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,如EditBox,Grid,ImageBox,Timer等等。每个控件都有自己的事件、方法
和属性。使用了控件的编程非常容易。首先,在程序的设计阶段可以设置一些属性,如大小,位置,标题(caption)等等;在程序运行阶段,可以更改这些属性,还可以针对不同的事件,调用不同的方法来实现对该控件的控制。控件就好像一块块的积木,程序要做的事只是将这些积木搭起来。控件的最大好处是可以重复使用,甚至可以在不同的编程语言之间使用,例如你可以在VB中嵌入用VC开发的控件。”
里面最后一句话比较重要,就是用VC开发的OCX控件,你可以在其它语言里面都能调用,这样很好的实现了功能化组件的良好循环使用,而且还可以实现跨语言地调用(例如,你完全可以用C#调用C++开发的OCX控件)。
下面开始介绍,如何用VC++一步步生成你想要的“*.ocx”文件。1.建立最简单的ocx文件并进行调试1.1建立最简单的ocx文件VC->新建项目->MFCActiveXWinZard
一路点击“确定”,直到点击“完成”。最后VC++会自动生成一些文件,这些文件就构成了ActiveX的基本模板,文件的主要结构如下:直接编译一下,然后在Debug目录下面就会生成一个名为“ocxDemo.ocx”的控件注册文件,然后利用“regsvr32”命令就可以实现本机对此控件的注册,然后就可以使用本语言或者跨语言编写程序时引用此控件来实现相应的功能(后面将会讲到)。
1.2ocx调试方法:VC++自带有一个调试控件的工具“ActiveX控件测试容器”,通过三种方式可以打开:
1.点击“调试”按钮,会出现如下对话框:
然后浏览"C:ProgramFilesMicrosoftVisualStudioCommonToolsTSTCON32.EXE“
2.系统的“开始“-》“程序”-》“MicrosoftVisualC++6.0”-》“MicrosoftVisualC++6.0Tools”-》“ActiveControlTestContainer”
3.VC++开发环境中的“工具”-》“ActiveXControlTestContainer”通过上面的任意一种方法,都可以调出下面的程序:右击空白区域,插入控件,然后会弹出下面的对话框:选中指定控件,然后点击确定,控件就被加载到此工具中了,然后可以通过这个工具来看此控件的相关事件响应等等。
2.自VC++生成的模板基础上自定义功能所有的自定义功能基本上都来自于“MFCClassWizard”类向导对话框。(“快捷键Ctrl+W”或者“查看”->“建立类向导…”)
在“Automation”选项卡中为控件添加方法和属性。在“ActiveXEvents”选项卡中为控件添加事件。2.1添加控件属性切换到“Automation”选项卡中,点击右边的“AddProperty…”会弹出对话框:Externalname:外部名称。指此控件被使用时,外部程序看到的属性名称,仅在外部引用时被使用。
Type:属性类型。除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Variablename:变量名称。此属性在控件源文件中的变量名称,在编写控件源码时使用。
Notificationfunction:提醒函数。当此属性被改变时,会触发此提醒函数。Implementation:实现方式。指属性的三种类型:固有型,成员变量型,Get/Set方法型。固有型是指系统赋予的固有属性,如背景色,标题;成员变量型是用户自定义的属性;Get/Set方法型,可能是指只能通过Get/Set方法才能获取和改变的变量吧(这个没研究)。
2.2添加控件方法在“Automation”选项卡中,点击右边的“AddMethod…”会弹出对话框:
Externalname:方法外部名称。Internalname:方法内部名称。Returntype:返回值类型。除了基本的整形等数据类型外,还有很多复杂的高级数据类型。
Implementation:实现方式。两种:固有方法,自定义方法。Parameterlist:参数列表。参数名称和参数类型:参数类型包含很多高级数据类型。
2.3添加控件事件切换到“ActiveXEvents”选项卡中,点击右边的“AddEvent…”会弹出对话框:
Externalname:事件外部名称。Internalname:事件内部名称。比外部名称多了个前缀“Fire”。Implementation:实现方式。两种:固有事件,自定义事件。固有事件一般是鼠标移动,双击等等事件,这些事件都由系统消息触发;自定义事件则是完全由用户定义的一个函数,但这个函数需要用户在源文件中调用(在内部调用,对于控件的使用方来说,就相当于在调用的地方此事件被触发,而内部传入的参数,则是此事件产生的消息附带信息)。
Parameterlist:参数列表。参数名称和参数类型:参数类型包含很多高级数据类型。
总述:通过“类向导”工具,为控件添加属性、方法和事件后,VC++会自动在相应的文件里面生成代码,比如内部方法属性和外部方法属性之间的映射,消息的建立,消息的声明,等等。如果用户要对引进行深入研究,还需要对程序的结构比较熟悉,知道各部分代码的作用,知道哪些地方的代码是系统自动生成的,哪些代码需要用户手动加入的。VisualC++开发环境虽然有很多优点,但有个缺点也很明显,就是代码结构比较乱,感觉没有VS2005和后面的VisualStudio系列要好。但是由于VC6.0作为一个比较经典的开发环境,而且网上的
有关C++的程序设计基本上都是基于VC6.0的,所以,有必要对其进行学习,便于自己读懂网上的代码并进行消化吸收。2.4生成ocx文件并调试直接编译用户加入了自定义代码的项目,然后在项目的Debug目录下面会生成一个ocx文件,这个就是此控件的注册文件了。
控件的调试工具仍然是“ActiveXControlTestContainer”。假设我们在控件中加入了一个事件:固有事件——“MouseMove”鼠标移动事件;用户自定义事件——ocxClick事件(此事件是通过“WM_MOUSEMOVE”消息来触发的,返回的是鼠标当前位置的x坐标)。
运行“ActiveXControlTestContainer”并插入当前控件,当鼠标在上面移动的时候,可以看到MouseMove产生了事件了。
同时可以通过“Control”-》“InvokeMethod”来对控件的方法进行测试,测试的方法就是你输入参数,它返回计算结果(下面以自定义的方法funHello为例)。3.控件的使用方法3.1注册控件ocx控件的安装方式有很多种,这里介绍最简单的一种。步骤:1.将需要安装的OCX控件文件复制到某个目录,例如C盘根目录下。2.进入开始,点击运行。3.在出现的框中键入regsvr32C:/xxxx.ocx。(XXXX为控件名,C:/为目录)
4.点击确认后等待出现提醒注册成功即可。3.2ActiveX控件的调用ActiveX作为一种通用的COM组件,可以被不同语言调用的。3.2.1通过VC++调用利用VC6.0建立一个MFC的基本对话框应用程序
在完成程序向导后。执行下面的步骤:1.执行“工程”-》“添加到工程”--》“ComponentsandControls…”。2.在弹出的文件浏览对话框中,找到RegisteredActiveXControls文件目录下的你刚才注册的控件,比如“OcxDemoControl”,然后点击“Insert”按钮即可将此控件添加到控件工具条集合中。
3.将控件工具条上新增加的OCX控件拖入到应用程序主窗口中。完成上面的步骤后,就可以像使用普通控件一样在VC中使用此控件了(右击此控件,可以查看此控件的“事件”和“属性”,就是你在编写控件源码时的那些“外部名称Externalname”)。
3.2.2通过C#调用其实这个才是重点,因为跨语言调用ActiveX技术最被笔者看好的地方。用VisualStudio2005新建一个C#.NET的Windows窗口程序,然后在工具箱面板上,右击“选择项”,选择COM组件,找到你注册的ActiveX控件:
确定后,那个OcxDemoControl控件就加载到工具箱里面了。可以直接拖动这个控件到C#.NET应用程序的主窗口上去了,然后就像使用普通控件那样使用此控件了。
比如,本文中的ActiveX控件的自定义事件中,是通过鼠标移动来触发,那么在应用程序中,只要鼠标移动到控件上,那么就会触发此自定义事件,并获取当前鼠标位置的横坐标。
4.最后一些Tip1)在自定义控件时,可在控件源码的OnDraw()函数中设置控件的外观(也就是控件被拖入到应用程序中时呈现的样子,一般默认是一个白色的方框内切椭圆的样式)。
2)用C#来使用ActiveX的事件时,事件所产生的数据都包含在Event变量中,只需要用个点运算符就可以取出来了。
5.展望控件函数的返回值类型那么多,那么复杂,如果要用得好,还需要对那些OLE数据类型进行好好学习,这个等今后需要时再慢慢学习吧。