Visual Studio c#开发ActiveX控件及制作CAB包总结Word格式.docx
- 文档编号:925304
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:28
- 大小:452.13KB
Visual Studio c#开发ActiveX控件及制作CAB包总结Word格式.docx
《Visual Studio c#开发ActiveX控件及制作CAB包总结Word格式.docx》由会员分享,可在线阅读,更多相关《Visual Studio c#开发ActiveX控件及制作CAB包总结Word格式.docx(28页珍藏版)》请在冰点文库上搜索。
System.Windows.Forms;
System.Runtime.InteropServices;
namespace
HelloBossma
{
///<
summary>
///Guid将用作控件的classid
///IObjectSafety的是用来标记可安全执行脚本的ActiveX控件
/summary>
[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();
}
///设置当前时间
paramname="
timeStr"
>
<
/param>
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:
if(_fSafeForInitializing==true)
pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;
default:
Rslt=E_NOINTERFACE;
returnRslt;
publicintSetInterfaceSafetyOptions(refGuidriid,
intdwOptionSetMask,
intdwEnabledOptions)
if(((dwEnabledOptions&
dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_CALLER)&
&
(_fSafeForScripting==true))
dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_DATA)&
(_fSafeForInitializing==true))
}
关于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);
这里还包含了一个可以被外部调用的方法,传进来一个字符参数,并显示出来:
///<
(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"
"
ahref="
http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd<
/a>
"
htmlxmlns="
ahref="
//www.w3.org/1999/xhtml"
//www.w3.org/1999/xhtml<
headrunat="
server"
<
title>
/title>
scripttype="
text/javascript"
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)
/script>
/head>
bodystyle="
font-size:
12px;
color:
black"
formid="
form1"
runat="
div>
objectclassid="
clsid:
codebase="
hellobossma/HelloBossma.CAB"
width="
442"
height="
87"
id="
HelloBossma"
name="
/object>
br/>
inputtype="
button"
value="
显示当前时间"
onclick="
SetTime()"
/>
/div>
/form>
/body>
/html>
ActiveX控件作为一个object添加到页面中,其classid是在编写HelloBossmaActiveX类时定义好的Guid值,codebase用来指示cab安装文件的路径,还可以设置宽度、高度。
另外其中文字受页面中字体样式的影响。
因为我们的ActiveX控件没有签名,所以将测试站点加到“本地Intranet”中或者“可信站点”中,并设置安全级别为“低”。
然后打开浏览器,提示安装,点击“安装”,稍等下,效果就出来了:
点击按钮,就可以通过javascript设置ActiveX控件中的时间了。
C#如何在ActiveX控件中调用javascript的函数,这里参考网上的例子介绍两种方法,虽然代码不一样,但是殊途同归。
而且都使用了mshtml。
1、方法一
(1)在VS项目中添加Com对象引用:
MicrosoftHtmlObjectLibrary(mshtml.tlb)
(2)ActiveX中公开一个方法,传递window对象到ActiveX中
ActiveX中公开一个方法,接受传递进来的参数
///<
///将window对象传递进来
obj"
Theobj.<
publicvoidSetHtml(objectobj)
html=(mshtml.HTMLWindow2Class)obj;
在页面中调用ActiveX的公开方法,传递当前window对象进去:
window.onload=function(){
document.HelloBossma.SetHtml(this);
};
(3)在ActiveX控件中添加一个按钮,当点击这个按钮时,触发页面中的javascript。
点击按钮的方法:
///调用页面Javascript
sender"
e"
privatevoidbutton1_Click(objectsender,EventArgse)
html.execScript("
CallByActiveX();
"
javascript"
现在卸载掉原来的ActiveX控件,安装新的控件,打开页面,点击按钮,看到如下效果,说明成功。
调用javascript时还可以传递参数,这里不做演示了,自己可以试一下。
参考:
2、方法二
和第一种方法相同。
(2)用c#实现两个COM类,IOleClientSite和IOleContainer
[ComImport,
Guid("
00000118-0000-0000-C000-000000000046"
),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
publicinterfaceIOleClientSite
voidSaveObject();
voidGetMoniker(uintdwAssign,uintdwWhichMoniker,objectppmk);
voidGetContainer(outIOleContainerppContainer);
voidShowObject();
voidOnShowWindow(boolfShow);
voidRequestNewObjectLayout();
0000011B-0000-0000-C000-000000000046"
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
publicinterfaceIOleContainer
voidEnumObjects([In,MarshalAs(UnmanagedType.U4)]intgrfFlags,
[Out,MarshalAs(UnmanagedType.LPArray)]object[]ppenum);
voidParseDisplayName([In,MarshalAs(UnmanagedType.Interface)]objectpbc,
[MarshalAs(UnmanagedType.BStr)]stringpszDisplayName,
[Out,MarshalAs(UnmanagedType.LPArray)]int[]pchEaten,
[Out,MarshalAs(UnmanagedType.LPArray)]object[]ppmkOut);
voidLockContainer([In,MarshalAs(UnmanagedType.I4)]intfLock);
(3)在ActiveX中编写CallJavascript方法:
///调用Javascript
Filenames"
Thefilenames.<
privatevoidCallJavaScript(stringparam)
//反射获取当前的控件的ClientSite
TypetypeIOleObject=this.GetType().GetInterface("
IOleObject"
true);
objectoleClientSite=typeIOleObject.InvokeMember("
GetClientSite"
BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,
null,
this,
null);
//获取Container
IOleClientSiteoleClientSite2=oleClientSiteasIOleClientSite;
IOleContainerpObj;
oleClientSite2.GetContainer(outpObj);
//参数数组
object[]args=newobject[1];
args[0]=param;
//获取页面的Script集合
IHTMLDocumentpDoc2=(IHTMLDocument)p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual Studio c#开发ActiveX控件及制作CAB包总结 c# 开发 ActiveX 控件 制作 CAB 总结