Visual Studio c#开发ActiveX控件及制作CAB包总结.docx
- 文档编号:22795704
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:28
- 大小:452.13KB
Visual Studio c#开发ActiveX控件及制作CAB包总结.docx
《Visual Studio c#开发ActiveX控件及制作CAB包总结.docx》由会员分享,可在线阅读,更多相关《Visual Studio c#开发ActiveX控件及制作CAB包总结.docx(28页珍藏版)》请在冰豆网上搜索。
VisualStudioc#开发ActiveX控件及制作CAB包总结
开发及测试环境:
(1)开发环境:
VisualStudio2008SP1
cabsdk(下载地址:
(2)测试环境:
WindowsServer2003R2SP2
IE6
2、创建项目
我这里创建了三个项目:
(1)HelloBossma:
项目模板:
Windows窗体控件库
(2)HelloBossmaSetup:
项目模板:
安装项目
(3)Web:
项目模板:
ASP.NET网站
3、HelloBossma项目
这个项目用于编写具体的控件,并生成安装文件所需要的dll。
(1)添加用户控件:
(2)设计控件:
添加Panel、GroupBox、Label控件。
NowTime是一个Label控件,用于显示时间。
然后在控件对应的代码文件中编写程序:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace HelloBossma
{
///
///Guid将用作控件的classid
///IObjectSafety的是用来标记可安全执行脚本的ActiveX控件
///
[Guid("636B8CE1-7512-464C-B63C-FC75BDCA21DB"),ProgId("HelloBossma.HelloBossmaActiveX"),ComVisible(true)]
publicpartialclassHelloBossmaActiveX:
UserControl,IObjectSafety
{
privateconststring_IID_IDispatch="{00020400-0000-0000-C000-000000000046}";
privateconststring_IID_IDispatchEx="{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
privateconststring_IID_IPersistStorage="{0000010A-0000-0000-C000-000000000046}";
privateconststring_IID_IPersistStream="{00000109-0000-0000-C000-000000000046}";
privateconststring_IID_IPersistPropertyBag="{37D84F60-42CB-11CE-8135-00AA004BB851}";
privateconstintINTERFACESAFE_FOR_UNTRUSTED_CALLER=0x00000001;
privateconstintINTERFACESAFE_FOR_UNTRUSTED_DATA=0x00000002;
privateconstintS_OK=0;
privateconstintE_FAIL=unchecked((int)0x80004005);
privateconstintE_NOINTERFACE=unchecked((int)0x80004002);
privatebool_fSafeForScripting=true;
privatebool_fSafeForInitializing=true;
publicHelloBossmaActiveX()
{
InitializeComponent();
}
///
///设置当前时间
///
///
publicvoidSetTime(stringtimeStr)
{
this.label2.Text=timeStr;
}
publicintGetInterfaceSafetyOptions(refGuidriid,
refintpdwSupportedOptions,
refintpdwEnabledOptions)
{
intRslt=E_FAIL;
stringstrGUID=riid.ToString("B");
pdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;
switch(strGUID)
{
case_IID_IDispatch:
case_IID_IDispatchEx:
Rslt=S_OK;
pdwEnabledOptions=0;
if(_fSafeForScripting==true)
pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER;
break;
case_IID_IPersistStorage:
case_IID_IPersistStream:
case_IID_IPersistPropertyBag:
Rslt=S_OK;
pdwEnabledOptions=0;
if(_fSafeForInitializing==true)
pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;
break;
default:
Rslt=E_NOINTERFACE;
break;
}
returnRslt;
}
publicintSetInterfaceSafetyOptions(refGuidriid,
intdwOptionSetMask,
intdwEnabledOptions)
{
intRslt=E_FAIL;
stringstrGUID=riid.ToString("B");
switch(strGUID)
{
case_IID_IDispatch:
case_IID_IDispatchEx:
if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_CALLER)&&
(_fSafeForScripting==true))
Rslt=S_OK;
break;
case_IID_IPersistStorage:
case_IID_IPersistStream:
case_IID_IPersistPropertyBag:
if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_DATA)&&
(_fSafeForInitializing==true))
Rslt=S_OK;
break;
default:
Rslt=E_NOINTERFACE;
break;
}
returnRslt;
}
}
}
关于IObjectSafety的实现参考了:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
namespaceHelloBossma
{
[ComImport,GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
publicinterfaceIObjectSafety
{
[PreserveSig]
intGetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]refintpdwSupportedOptions,[MarshalAs(UnmanagedType.U4)]refintpdwEnabledOptions);
[PreserveSig()]
intSetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]intdwOptionSetMask,[MarshalAs(UnmanagedType.U4)]intdwEnabledOptions);
}
}
这里还包含了一个可以被外部调用的方法,传进来一个字符参数,并显示出来:
///
///设置当前时间
///
///
publicvoidSetTime(stringtimeStr)
{
this.label2.Text=timeStr;
}
(3)设置生成属性,勾选:
为Com互操作注册
(4)生成项目,生成这两个文件:
HelloBossma.dll
HelloBossma.tlb
是必须的,否则生成不成功。
4、HelloBossmaSetup项目
这是一个安装项目,用来生成安装程序。
(1)在项目上点右键,【添加】->【项目输出】,选择上边的HelloBossma项目
(2)在安装项目上点右键,属性
安装URL:
貌似用于查找应用程序更新,具体看:
这个目录最好是实际存在的,用来存放生成的安装文件,供客户端下载安装。
没有的话就随便输入一个吧。
(3)添加卸载程序
拷贝文件C:
\Windows\System32\msiexec.exe文件,修改文件名为Uninstall.exe,添加到安装项目中,然后创建一个快捷方式。
在【用户的“程序”菜单下边】添加一个文件夹HelloBossma,将快捷方式拖动到这里边。
在卸载控件上点击右键,属性:
设置Arguments,就是指定要卸载的程序,后面的ProductCode可以这样获得:
选中项目,然后鼠标放到右侧的“属性”上,就可以看到ProductCode了:
(4)最后生成项目
5、制作CAB文件
(1)为了方便操作,可以将CABARC.EXE添加到环境变量中:
桌面上右击“我的电脑”,“属性”,“高级”,“环境变量”,“系统变量”,找到“Path”,在后边把CABARC.EXE所在的路径添加上去,注意用分号隔开新添加的路径。
(2)准备好文件
install.inf:
CAB安装配置文件
HelloBossmaSetup.msi:
安装程序文件
install.inf文件的内容:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[SetupHooks]
hook1=hook1
[hook1]
run=msiexec.exe/i"%EXTRACT_DIR%\HelloBossmaSetup.msi"/qn
run:
一般只需要修改这个就行了
(3)执行cabarc命令
桌面左下角“开始”,“运行”,输入cmd,打开命令提示符工具,进入准备好的文件的目录,执行命令:
cabarcnHelloBossma.cabHelloBossmaSetup.msiinstall.inf
显示“Completedsuccessfully”,打开所在目录,就可以看到生成的文件了。
6、部署到网站
在网站中新建一个目录hellobossma,将生成的cab文件拷贝到里边。
新建一个网页,将控件添加到页面:
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"" //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http: //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> //www.w3.org/1999/xhtml">http: //www.w3.org/1999/xhtml"> functionSetTime(){ vard=newDate(); varvYear=d.getFullYear(); varvMon=d.getMonth()+1; varvDay=d.getDate(); varvHour=d.getHours(); varvMin=d.getMinutes(); varvSec=d.getSeconds(); document.HelloBossma.SetTime(vYear+"-"+vMon+"-"+vDay+""+vHour+": "+vMin+": "+vSec) } 12px;color: black"> 636B8CE1-7512-464C-B63C-FC75BDCA21DB"codebase="hellobossma/HelloBossma.CAB"width="442"height="87"id="HelloBossma"name="HelloBossma">