设置Shell=new(Shell.appliecaton)

设置Shell=new(Shell.appliecaton),shell,vb6,windows-10,Shell,Vb6,Windows 10,我一直在用Shell解压一个文件。突然,它停止工作,出现错误: “类不支持自动化或不支持预期的接口” 如果我在Win7机器上构建它,它会在Win7机器上运行,但不会在Win10上运行。 如果我在Win10机器上构建它,它会在Win10机器上运行,但不会在Win7机器上运行。 当在Win7机器上构建时,早期版本在这两台机器上运行良好 我仔细比较了.aip构建文件(高级安装程序),它们是相同的。我已经有3到4个月没有接触过有问题的代码了 以下是我正在使用的代码(您可能会认出它): { 将ShellC

我一直在用Shell解压一个文件。突然,它停止工作,出现错误:

“类不支持自动化或不支持预期的接口”

如果我在Win7机器上构建它,它会在Win7机器上运行,但不会在Win10上运行。 如果我在Win10机器上构建它,它会在Win10机器上运行,但不会在Win7机器上运行。 当在Win7机器上构建时,早期版本在这两台机器上运行良好

我仔细比较了.aip构建文件(高级安装程序),它们是相同的。我已经有3到4个月没有接触过有问题的代码了

以下是我正在使用的代码(您可能会认出它):

{ 将ShellClass设置为shell32.Shell 将文件源设置为shell32.Folder Dim Filedest作为shell32.文件夹 模糊不清的Folderitems如shell32.Folderitems

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降级为“用于脚本编写”的贫民区。