设置Shell=new(Shell.appliecaton)
我一直在用Shell解压一个文件。突然,它停止工作,出现错误: “类不支持自动化或不支持预期的接口” 如果我在Win7机器上构建它,它会在Win7机器上运行,但不会在Win10上运行。 如果我在Win10机器上构建它,它会在Win10机器上运行,但不会在Win7机器上运行。 当在Win7机器上构建时,早期版本在这两台机器上运行良好 我仔细比较了.aip构建文件(高级安装程序),它们是相同的。我已经有3到4个月没有接触过有问题的代码了 以下是我正在使用的代码(您可能会认出它): { 将ShellClass设置为shell32.Shell 将文件源设置为shell32.Folder Dim Filedest作为shell32.文件夹 模糊不清的Folderitems如shell32.Folderitems设置Shell=new(Shell.appliecaton),shell,vb6,windows-10,Shell,Vb6,Windows 10,我一直在用Shell解压一个文件。突然,它停止工作,出现错误: “类不支持自动化或不支持预期的接口” 如果我在Win7机器上构建它,它会在Win7机器上运行,但不会在Win10上运行。 如果我在Win10机器上构建它,它会在Win10机器上运行,但不会在Win7机器上运行。 当在Win7机器上构建时,早期版本在这两台机器上运行良好 我仔细比较了.aip构建文件(高级安装程序),它们是相同的。我已经有3到4个月没有接触过有问题的代码了 以下是我正在使用的代码(您可能会认出它): { 将ShellC
If sFileSource = "" Or sFileDest = "" Then
GoTo Zip_Activity_Err
End If
Select Case UCase$(Action)
Case "ZIPFILE"
If Right$(UCase$(sFileDest), 4) <> ".ZIP" Then
sFileDest = sFileDest & ".ZIP"
End If
If Not Create_Empty_Zip(sFileDest) Then
GoTo Zip_Activity_Err
End If
Set ShellClass = New shell32.Shell
Set Filedest = ShellClass.NameSpace(sFileDest)
Call Filedest.CopyHere(sFileSource, 20)
Case "ZIPFOLDER"
If Right$(UCase$(sFileDest), 4) <> ".ZIP" Then
sFileDest = sFileDest & ".ZIP"
End If
If Not Create_Empty_Zip(sFileDest) Then
GoTo Zip_Activity_Err
End If
Set ShellClass = New shell32.Shell
Set FileSource = ShellClass.NameSpace(sFileSource)
Set Filedest = ShellClass.NameSpace(sFileDest)
Set Folderitems = FileSource.Items
Call Filedest.CopyHere(Folderitems, 20)
Case "UNZIP"
If Right$(UCase$(sFileSource), 4) <> ".ZIP" Then
sFileSource = sFileSource & ".ZIP"
End If
Set ShellClass = New shell32.Shell <--- Here's where it fails
Set FileSource = ShellClass.NameSpace(sFileSource)
Set Filedest = ShellClass.NameSpace(sFileDest)
Set Folderitems = FileSource.Items
Filedest.CopyHere Folderitems, _
NoUserInterfaceIfErr + _
NoConfirmOfNewDir + _
YesToAll + NoProgBox
Case Else
End Sele
如果sFileSource=“”或sFileDest=“”则
转到Zip\u活动\u错误
如果结束
选择案例UCase$(操作)
案例“ZIPFILE”
如果右$(UCase$(sFileDest),4)“.ZIP”,则
sFileDest=sFileDest&“.ZIP”
如果结束
如果不创建\u Empty\u Zip(sFileDest),则
转到Zip\u活动\u错误
如果结束
Set ShellClass=New shell32.Shell
Set Filedest=ShellClass.NameSpace(sFileDest)
调用Filedest.CopyHere(sFileSource,20)
案例“ZIPFOLDER”
如果右$(UCase$(sFileDest),4)“.ZIP”,则
sFileDest=sFileDest&“.ZIP”
如果结束
如果不创建\u Empty\u Zip(sFileDest),则
转到Zip\u活动\u错误
如果结束
Set ShellClass=New shell32.Shell
设置FileSource=ShellClass.NameSpace(sFileSource)
Set Filedest=ShellClass.NameSpace(sFileDest)
设置Folderitems=FileSource.Items
调用Filedest.CopyHere(Folderitems,20)
案例“解压”
如果右$(UCase$(sFileSource),4)“.ZIP”,则
sFileSource=sFileSource&“.ZIP”
如果结束
Set ShellClass=New shell32.Shell解决方案可能是使用后期绑定
所以使用Set Obj=CreateObject(“Shell.Application”)
后期绑定是一种对话
YourProg:Hi shell,您有名称空间命令吗
谢尔:是的,我知道,这是第五号令
YourProg:请执行5号命令-以下是参数
这是返回数据,如果有的话
早期绑定您的程序使用GUID编译,并跳转到vtable中的第5个偏移量。一个月前在您的Win7计算机上更新了Shell32.dll的神秘KB 3123862修补程序可能与此有关。在XP之后,Shell32.dll似乎一打喷嚏就破坏了二进制兼容性。将一切归咎于.Net pallrosoft、纯粹的懒惰或不专注,但事实就是如此。后期绑定是你唯一的防御,因为他们已经将此API降级为“用于脚本编写”的贫民区。