ActiveX插件自动更新的问题,困扰很久,求助!
因项目需要,用c#制作了一个ActiveX插件,功能很简单,控件已实现客户端安装,这些都没问题!我贴的代码是简化了功能的,具体业务没有写,太多。View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
namespace ActiveX
{
[ComVisible(true)]
[Guid("C77695C2-7341-4b81-990E-39E91923BB44")]
public partial class NontaxActiveX : UserControl, IObjectSafety
{
public NontaxActiveX()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
MessageBox.Show(textBox1.Text == "" ? "请输入内容" : textBox1.Text);
}
else
{
MessageBox.Show("什么也没有???????");
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
#region IObjectSafety成员
private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";
private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
private const int S_OK = 0;
private const int E_FAIL = unchecked((int)0x80004005);
private const int E_NOINTERFACE = unchecked((int)0x80004002);
private bool _fSafeForScripting = true;
private bool _fSafeForInitializing = true;
public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = riid.ToString("B");
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
Rslt = S_OK;
pdwSupportedOptions = 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;
}
return Rslt;
}
public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = 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;
}
return Rslt;
}
#endregionAssemblyInfo.cs
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
// 有关程序集的常规信息通过下列属性集
// 控制。更改这些属性值可修改
// 与程序集关联的信息。
[assembly: AllowPartiallyTrustedCallers()]
[assembly: AssemblyTitle("ActiveX")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ActiveX")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(true)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("080c08e4-90eb-4ad6-a73f-c93fe6813680")]
// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]IObjectSafety.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ActiveX
{
[ComImport,GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)]
ref int pdwSupportedOptions,[MarshalAs(UnmanagedType.U4)]
ref int pdwEnabledOptions);
[PreserveSig()]
int SetInterfaceSafetyOptions(ref Guid riid,[MarshalAs(UnmanagedType.U4)]
int dwOptionSetMask,[MarshalAs(UnmanagedType.U4)]
int dwEnabledOptions);
}
}vs2008安装项目依赖ActiveX项目 输出类库,最后生成NontaxInstaller.msi和setup.exe
ActiveX项目生成属性中 已经 勾选了 “为COM互操作注册”
setup项目属性中 已经设置 RemovePreviousVersion属性设置为True
此处省略了打包成CAB文件的步骤,CABARC.EXE打包的
"D:\cab\CABARC.EXE" -s 6144 n D:\cab\NontaxInstaller.cab D:\cab\NontaxInstaller.msi D:\cab\NontaxInstaller.inf
---------NontaxInstaller.inf-----------------
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Setup Hooks]
hook1=hook1
[hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\NontaxInstaller.msi" /qn
-----------------------------------------------------------------
第一次部署安装:客户端访问
测试网页
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>test</title>
</head>
<body>
<div style="text-align:center;">
<object id ="ActiveX" classid ="C77695C2-7341-4b81-990E-39E91923BB44"
codebase="Nontax/NontaxInstaller.cab#version=1,0,2"></object>
</div>
</body>
</html>客户端首次访问,插件可以正常安装,并且功能一切正常(抛开IE安全性设置不讲)
问题:
现在对插件功能扩展:
1.重新生成ActiveX项目的GUID,并且在代码中替换
2.修改setup安装项目版本号1.0.2(初始版本为1.0.1),此时productcode会自动重新生成一次
3.修改HTML测试网页,修改GUID和插件版本号
第二次测试:打开网页后 提示安装插件,安装后,网页显示的还是老版本插件,刷新也没有变化。
此时查看控制面板中 的 安装、卸载程序,发现新插件已经更新安装,并且插件版本号已经是第二次发布的版本号。
没有办法,在控制面板中卸载掉插件,重新打开网页,提示安装插件,安装成功,显示新版本插件,功能运行正常!!!
万分苦恼,查了很多资料,都是很老的帖子,介绍的内容页多数重复,根本没有自动更新的这个问题。
恳请各位大虾支招,谢谢!!
--------------------编程问答-------------------- 不需要重新生成GUID吧
下载到本地后,重新注册
--------------------编程问答-------------------- http://stackoverflow.com/questions/10898324/deploy-new-version-of-an-existing-activex-control
补充:.NET技术 , C#