自动更新程序版本DLL问题讨论.如何做到多客户端(100以上)自动更新.利用IE功能下载CAB包.使其更新CAB包功能?

dzq138 2005-04-21 11:19:04
自动更新程序版本DLL问题讨论.如何做到多客户端(100以上)自动更新.利用IE功能下载CAB包.使其更新CAB包功能?

局域网内的应用程序,业务应用都已经写成DLL,但有时需要更新一下DLL版本。
因为程序的客户端很多,一台一台的去更新肯定很费时费力.

设想用一个固定的EXE运行文件下载DLL,再运行业务DLL,SHOW窗体.完成自动更新程序功能.
也就是说,程序只需安装一个空壳EXE,只是负责更新版本与打开第一个窗口.

程序是由多个DLL与一个启动程序组成.
做一个启动客户端.负责更新CAB包中的DLL.

上面的是功能设想要求,
要问的是要解决问题:
一、除了用IE下载DLL之外是否有更好的办法?
二、用IE下载CAB包更新存的如下几个问题需解决:
1)如何自动降低IE的安全级别?当然要先保存原来的安全级别设置,下载完成后,恢复原安全安全级别设置。(见别人写了一下DLL可以达到此目的,但自己想写一下,不知是不是写注册表内容实现的。http://www.hdfdc.gov.cn/download/IESM.dll,里面有一类为IESMLib.Holder 方法有三个为:OpenDoor()降低安全级别 Restore() 恢复安全级别设置 Save())
2)版本比较?如原DLL的版本为1.0.0.1现在的新版本为1.0.0.2是新的才执行更新,否则执行原版本的DLL。()
3)当然要建立一个IIS的HTML文件内容如下:
-----------------------------
<OBJECT ID="clsUserProfile"
CLASSID="CLSID:7286826D-B9A9-4A37-BC6D-1E7EEC76BB92"
CODEBASE="UPDATE.CAB#version=1,0,0,1">
</OBJECT>
-----------------------------
如何调用IE去下载此HTML页?用Microsoft Internet Controls部件?



写得较乱,望给点耐性看完。
欢迎各位兄台解答一下以上问题。或给点更好的自动更新版本主意,
先在此先多谢各位.
...全文
141 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzq138 2005-05-09
  • 打赏
  • 举报
回复
..
是是非非 2005-04-22
  • 打赏
  • 举报
回复
如果是VC写的控件那就更简单了

MSDN里面有实例
是是非非 2005-04-22
  • 打赏
  • 举报
回复
如何在VB中实现ActiveX控件的IobjectSafety接口
--------------------------------------------------------------------------------
总述
本文叙述了如何在VB中实现控件的IobjectSafety接口,以标志该控件是脚本安全和初始
化安全的。VB控件默认的处理方式是在注册表中注册组件类来标识其安全性,但实现Iobject
Safety接口是更好的方法。本言语包括了实现过程中所需的所有代码。
请注意,控件只有确确实实是安全的,才能被标识为“安全的”。本文并未论及如何确保
控件的安全性,这个问题请参阅Internet Client Software Development Kit (SDK)中的相关
文档 "Safe Initialization and Scripting for ActiveX Controls",它在Component Devel
opment 栏目中。

相关信息:
<此处略去了一段也许无关紧要的警告>
现在开始循序渐进地举例说明怎样创建一个简单的VB控件,以及怎样将它标识为脚本安全
和初始化安全。首先新建一个文件夹来存放在本例中所产生的文件。
从VB CD-ROM取得OLE 自动化类库的制作工具。将VB安装光盘中\Common\Tools\VB\Unsupp
rt\Typlib\目录下所有内容一并拷贝到前面新建的项目文件夹中。
把下列内容拷贝到“记事本”中,然后保存到上述文件夹,文件名为Objsafe.odl:
[
uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
helpstring("VB IObjectSafety Interface"),
version(1.0)
]
library IObjectSafetyTLB
{
importlib("stdole2.tlb");
[
uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
helpstring("IObjectSafety Interface"),
odl
]
interface IObjectSafety:IUnknown {
[helpstring("GetInterfaceSafetyOptions")]
HRESULT GetInterfaceSafetyOptions(
[in] long riid,
[in] long *pdwSupportedOptions,
[in] long *pdwEnabledOptions);

[helpstring("SetInterfaceSafetyOptions")]
HRESULT SetInterfaceSafetyOptions(
[in] long riid,
[in] long dwOptionsSetMask,
[in] long dwEnabledOptions);
}
}
在命令行提示符下切换到项目文件夹,输入下列命令创建一个.tlb 文件:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
在VB中新建一个ActiveX Control 项目。修改属性,把项目命名为IobjSafety,控件命名
为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码 MsgB
ox "Test" 。
打开菜单“工程->引用”,点“浏览”,找到刚刚建立的Objsafe.tlb,把它加入到引用中。
增加一个新module名为basSafeCtl,并在其中加入下列代码:

Option Explicit
Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"
Public Const IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}"
Public Const IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}"
Public Const IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}"
Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
Public Const E_NOINTERFACE = &H80004002
Public Const E_FAIL = &H80004005
Public Const MAX_GUIDLEN = 40

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(pDest As Any, pSource As Any, ByVal ByteLen As Long)
Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _
Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long

Public Type udtGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(7) As Byte
End Type

Public m_fSafeForScripting As Boolean
Public m_fSafeForInitializing As Boolean

Sub Main()
m_fSafeForScripting = True
m_fSafeForInitializing = True
End Sub
在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting 和
m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。
打开控件代码窗口,在声明部分加入如下代码(如果有Option Explicit语句,当然要保证代
码放在其后):
Implements IObjectSafety
把下面两个过程代码拷贝到控件代码中:

Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)

Dim Rc As Long
Dim rClsId As udtGUID
Dim IID As String
Dim bIID() As Byte

pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
INTERFACESAFE_FOR_UNTRUSTED_DATA

If (riid <> 0) Then
CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)
Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
Rc = InStr(1, bIID, vbNullChar) - 1
IID = Left$(UCase(bIID), Rc)

Select Case IID
Case IID_IDispatch
pdwEnabledOptions = IIf(m_fSafeForScripting, _
INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)
Exit Sub
Case IID_IPersistStorage, IID_IPersistStream, _
IID_IPersistPropertyBag
pdwEnabledOptions = IIf(m_fSafeForInitializing, _
INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)
Exit Sub
Case Else
Err.Raise E_NOINTERFACE
Exit Sub
End Select
End If
End Sub

Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)
Dim Rc As Long
Dim rClsId As udtGUID
Dim IID As String
Dim bIID() As Byte

If (riid <> 0) Then
CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)
Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
Rc = InStr(1, bIID, vbNullChar) - 1
IID = Left$(UCase(bIID), Rc)

Select Case IID
Case IID_IDispatch
If ((dwEnabledOptions And dwOptionsSetMask) <> _
INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then
Err.Raise E_FAIL
Exit Sub
Else
If Not m_fSafeForScripting Then
Err.Raise E_FAIL
End If
Exit Sub
End If

Case IID_IPersistStorage, IID_IPersistStream, _
IID_IPersistPropertyBag
If ((dwEnabledOptions And dwOptionsSetMask) <> _
INTERFACESAFE_FOR_UNTRUSTED_DATA) Then
Err.Raise E_FAIL
Exit Sub
Else
If Not m_fSafeForInitializing Then
Err.Raise E_FAIL
End If
Exit Sub
End If

Case Else
Err.Raise E_NOINTERFACE
Exit Sub
End Select
End If
End Sub
保存后,把工程编译成OCX文件。现在控件已经实现了IObjectSafety 接口。在.htm中加入这件控件试一试吧。
是是非非 2005-04-22
  • 打赏
  • 举报
回复
:Microsoft Updater Application Block
没听说过,不知道

===========

不知道你的控件到底是怎么用的,如果只是在浏览器里面使用
那不需要任何特殊设置,1。实现IObjectSafety,2、设置好版本兼容就没问题了
是是非非 2005-04-22
  • 打赏
  • 举报
回复
2)版本比较
这个在 ="UPDATE.CAB#version=1,0,0,1"> 里面已经有了版本号
IE会自动检查版本的
是是非非 2005-04-22
  • 打赏
  • 举报
回复
1)如何自动降低IE的安全级别?
在你的控件里面实现 IObjectSafety接口,在默认的安全级别上就可以无提示运行
dzq138 2005-04-22
  • 打赏
  • 举报
回复
另:Microsoft Updater Application Block
是否可用?

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧