vs2005 C# 开发activex 控件,客户端安装后,显示一个红叉,求教
- 提问者网友:雨不眠的下
- 2021-07-24 07:24
相关步骤如下:
==================================================================================
1.编写activex 插件DLL功能组件,并配置生成
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
=============================
通过IE安全控件认证,实现IObjectSafeTy接口
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
IObjectSafety是一个COM下的接口,对于C++程序来说,只需要实现它就行了,而.NET之下没有这个接口,在这种情况下,我们的ActiveX控件就是一个不带类型库的COM组件,必须使用C#代码重新定义COM接口。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
^^^^^^^^^^^^^^^^^^^^^^^^^^
实现IObjectSafety接口来向IE表明ActiveX控件的安全标识,以保证控件再次打包时安全标识不会被被改写。
^^^^^^^^^^^^^^^^^^^^^^^^^^
#####################################
/// <summary>
/// 创建IObjectSafety接口
/// </summary>
[ComImport, Guid("415fa9ac-887c-48da-a7c2-db8fc31c44f1")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
void GetInterfacceSafyOptions(
int riid,
out int pdwSupportedOptions,
out int pdwEnabledOptions);
[PreserveSig]
void SetInterfaceSafetyOptions(
int riid,
int dwOptionsSetMask,
int dwEnabledOptions);
}
#####################################
实现IObjectSafety接口代码:
#####################################
#region IObjectSafety 成员
public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
throw new System.NotImplementedException();
}
#endregion
#####################################
===========================
2.添加安装项目,以DLL文件项目为主输出,生成activex插件的msi格式的可安装文件
=========================
改动ActiveX控件的主输出文件的属性,将其Register属性改为vsdrpCOM.
=========================
3.编写inf文件(内容见底部)
4.根据msi文件和inf文件用CABARC.EXE生成cab文件(打包)
CABARC.EXE -s 6144 n C:\ControlSetUp.cab C:\ControlSetUp.msi C:\ControlSetUp.inf
5.生成pfx密钥(测试证书及密钥)
===================
makecert -r -n "CN= BroadWay Firm" -b 01/01/2008 -e 01/01/2018 -sv c:\myselfName.pvk c:\myselfName.cer
cert2spc c:\myselfName.cer c:\myselfName.spc
pvkimprt -pfx c:\myselfName.spc c:\myselfName.pvk
===================
6.为cab包签名
signtool signwizard
给数据盖时间戳
http://timestamp.verisign.com/scripts/timstamp.dll
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
以上生成过程中,都没有出问题,最后在客户端安装过以后,显示是个红叉.. 望有知者指教.谢谢
附:
[inf文件]
=========================
[Setup Hooks]
hook1=hook1
[hook1]
run=msiexec.exe /i %EXTRACT_DIR%\ControlSetUp.msi /qn
[Version]
; This section is required for compatibility on both Windows 95 and Windows NT.
Signature="$CHICAGO$"
AdvancedInf=2.0
=========================
- 五星知识达人网友:蓝房子
- 2021-07-24 07:58
你的证书是自制的,别的电脑上不信任你的控件。
解决办法:1、花钱买一个正规的证书(要审核资格的,只有一定规模的软件公司才能买到),2、自行安装“证书信任链”,具体你可以去下载一个pdf文件: http://suntongo.ys168.com,“ATL控件....pdf”
- 1楼网友:刀戟声无边
- 2021-07-24 09:02
一、程序描述: 程序环境:windows Xp sp2, ie 6, tomcat 5.5, vc++6.0
程序过程:控件做成ocx文件,用于客户端调用本地硬件,其中有用到第三方几个.dll文件。采用windows自带iexpress.exe 打包成cab文件,在服务器端jsp页面进行控件调用,下载cab文件并自动注册。
二、程序问题: 遇到问题: 1. cab文件无法下载,而且根本不加提示。 2. 下载好的cab文件在system32中能够看到,但是页面仍然不能显示,一把红叉,并且无法使用。
问题测试: 1. 浏览器页面根本没有下载提示,考虑应该是cab的路径问题,也曾考虑是ie浏览器的安全问题。将安全降到最低测试。反复更改cab路径。 2. 这个问题最郁闷,搞了很久。考虑首先是安全问题,然后在网上搜索之后说是sp2调高了安全策略,有说降低安全,有说需要对程序进行数字签名。
问题解决: 1. 确实是路径不对,与安全无关。当在jsp中代码为: <OBJECT id=pos codebase="TestCAB.CAB#version=1,0,0,1" height=100 classid="CLSID:719A1D6E-7099-4123-9D63-F0118AFF2D61" VIEWASTEXT></OBJECT> TestCAB.CAB文件应该放置在tomcat5.5安装目录Tomcat 5.5\webapps下该调用jsp所在的工程下。 2. 不需要更改安全级别,而应该在Internet选项-〉安全-〉受信任的站点-〉站点 中添加服务器地址。注意:不要选复选框“对该区域中的所有站点要求服务器验证”。
三、总结: 1. 将ocx文件以及第三方dll文件打包成cab文件: Internet 软件分发单位是“软件包”,它由包含.INF文件或软件分发.OSD文件(或两者都包括)的.CAB文件所组成。一个分发单位也可以包含软件组件,如 ActiveX 控件(.OCX)、.DLL文件、.EXE文件、Java类文件或小程序。当Web页上OBJECT元素的CODEBASE特性引用包含.INF文件的. CAB文件时,Internet Explorer将自动把.CAB文件作为软件分发单位下载并安装,每次访问时还会自动检测版本并进行更新。 INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如.DLL或者其它.OCX)。一个.INF文件就捆绑了.CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。 先自己写了一个inf文件,其中信息包括将.ocx文件,以及相关的.dll文件打包,并下载到文件夹:\WINDOWS\system32,详细标注如下: [version] signature="$CHICAGO$" AdvancedINF=2.0
[DefaultInstall] CopyFiles=install.files RegisterOCXs=RegisterFiles [RInstallApplicationFiles] CopyFiles=install.files RegisterOCXs=RegisterFiles [DestinationDirs] install.files=11 [SourceDisksNames] 1=%DiskName%,TestCAB.CAB,1
[Add.Code] pcpos.ocx=pcpos.ocx Comm.dll=comm.dll pcpos.dll=pcpos.dll TCPCLNT.dll=TCPCLNT.dll
[install.files] pcpos.ocx=pcpos.ocx Comm.dll=comm.dll pcpos.dll=pcpos.dll TCPCLNT.dll=TCPCLNT.dll
[SourceDisksFiles] pcpos.ocx=1 Comm.dll=1 pcpos.dll=1 TCPCLNT.dll=1
[pcpos.ocx] file-win32-x86=thiscab RegisterServer=yes clsid={719A1D6E-7099-4123-9D63-F0118AFF2D61} DestDir=11 FileVersion=1,0,0,1
[Comm.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1
[pcpos.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1
[TCPCLNT.dll] file-win32-x86=thiscab RegisterServer=yes DestDir=11 FileVersion=1,0,0,1
[RegisterFiles] %11%\pcpos.ocx
注释: "thiscab" 是一个关键字,意指包含该INF的CAB文件。也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,如: file-win32-x86= http://www.mysite.com/mydir/NEEDED.DLL 关键字"file-win32-x86" 指定平台是 x86。 文件版本号可见属性。 "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/ /SYSTEM32; "clsid" 指的是要安装控件的CLSID。
制作cab: 使用\WINDOWS\system32\iexpress.exe。 1) 选择“Create new Self Extraction Directive file”,点击下一步。 2) 选择“Create compressed files only(ActiveX Installs)”,点击下一步。 3) 点击Add,文件添加(pcpos.ocx,pcpos.dll,comm.dll,tcpclnt.dll),点击下一步。 4) 点击Browse,输入.CAB文件的存放地址(包含所取文件名),这里取TestCAB.CAB,并且要选中 “Store files using Long File Name inside Package”。点击下一步。 5) 选择“Don’t save”,一直点击下一步,直到完成。
注意: 如果控件已经在客户机注册,并且不是通过.CAB的方式注册,那么通过.CAB自动注册的时候,该控件将无法被更新。必须先手动删除该文件。
2. 对CAB文件进行数字签名 传说中数字签名之后就可以不出现提示而自动下载,所以也试试: 在\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin 中间有三个小工具,就用他们来实现数字签名。 1.Makecert.exe ---证书创建工具 2.Cert2Spc.exe ---发行者证书测试工具 3.Signcode.exe ---文件签名工具
步骤: 1) makecert -ss name -n "CN=公司名" -sv d:\pos.pvk -r d:\pos.cer 其中sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置,-sv 导出私钥文件(为了签名使用)。注意:这个时候会让输入三次密码,三次要完全一致。 2) 使用Cert2Spc生成spc发行者证书(可选):cert2spc d:\pos.cer c:\pos.spc 3) 双击signcode,不带参数会启动签名向导。先选择要签名文件,下一步,选择“自定义”,下一步,选择“从文件选择”,添加刚生成的pos.cer证书,下一步,选择刚生成的私钥pos.pvk,再下一步,可spc证书,再一直下一步。添加时间戳,在时间戳填入http: //timestamp.verisign.com/scripts/timstamp.dll TestCAB.CAB,再下一步完成。
这样就对CAB文件进行了签名,但是这个时候点击这个文件会发现证书不可用,原因是证书没有安转。文件属性->数字证书->详细信息-〉查看证书-〉安装证书,进入安装证书向导,存放区域选择“受信任的根证书颁发机构”,点击完成即可。
在客户端测试: 1) 加入证书,浏览器-〉工具-〉Internet选项-〉内容-〉证书-〉受信任的颁发机构-〉导入证书。 2) 在有证书的情况下,如果服务器没有加入“可信任网址”,提示下载的时候会显示证书所签内容,没有证书则提示为“未知”。 3) 如果服务器已加入“可信任网址”,并且已导入证书,则不提示任何信息,在用户毫无感觉情况下下载。如果没有加入“可信任网址“,控件可以正常下载但仍然不能正常使用,与是否签名无关。
四、问题: 1.是否可以不添加“可信任网址”。 2.数字签名的作用,授权证书与不授权证书的区别。
QQ空间升级什么时候能好? |
舍本什么 |
爱几个女孩会怎样?属于花心不? |
丝路英雄外城什么建筑最重要 |
能在手机做问问任务吗? |
斯诺码尔破曦鞋子多少钱啊 |
去年的诺贝尔奖,有没有中国人啊,如果有他叫 |
Dnf魔导分析 |
新鲜羊奶要怎么吃? |
我的QQ停车位为什么突然之间 等级变零 现金变 |
怎么对“朋友” 1 |
I am on |
人的脸怎样才能没有皱纹 |
宝贝,对不起,我不能够陪你了.下辈子,好么?翻 |
关于杀马特发型 |