【问题标题】:How create variables of types in COM object using late binding?如何使用后期绑定在 COM 对象中创建类型变量?
【发布时间】:2014-10-06 11:42:46
【问题描述】:

这可能是一个菜鸟问题,但似乎尽管检查了 15 多个资源,但在 .NET 中使用 COM 接口时我仍然缺少一件事。

我想使用 Windows Shell 解压缩文件。 (我的目标:适用于 Windows XP 及更高版本,没有第 3 方 Zip 库,没有 .DLL 与我的 exe 一起出现,。)只需实例化Shell.Application COM 对象并调用它的方法。 (简约的方法。)

我可以使用早期绑定来处理它(source,构建正常):

Dim sc As New Shell32.ShellClass()
Dim SrcFlder As Shell32.Folder = sc.NameSpace(sourceFilename)
Dim DestFlder As Shell32.Folder = sc.NameSpace(destinationDirName)
Dim Items As Shell32.FolderItems = SrcFlder.Items()
DestFlder.CopyHere(Items, 16) '16 = Respond with "Yes to All"

我也可以使用 中的 late 绑定来处理它,我有经验。但是当涉及到COM 模块中的类型 时,我不确定如何 中使用后期绑定。以下转换后的代码的前两行有效,但是如何创建 Shell32.folder 类型的变量?它不是像Shell.Application 那样的公共类型(在Windows 注册表中注册)。

Dim st As Type = Type.GetTypeFromProgID("Shell.Application", True)
Dim sc As Object = Activator.CreateInstance(st, True)

'how to instantiate the following 'Shell32.Folder' and 'Shell32.FolderItems' types?
'Dim SrcFlder As Shell32.Folder = sc.NameSpace("d:\test.zip")
'Dim DestFlder As Shell32.Folder = sc.NameSpace("d:\test")
'Dim Items As Shell32.FolderItems = SrcFlder.Items()

'this will be called probably through the reflection, correct?
'DestFlder.CopyHere(Items, 16)  '16 = Respond with "Yes to All"

重新阅读此示例:我主要不是询问解压缩(尽管我需要它),但我想使用后期绑定(不仅使用早期绑定)正确处理 .NET 中的 COM 对象。

【问题讨论】:

    标签: .net4.0 vba .net .net vb.net com .net-4.0 late-binding


    【解决方案1】:

    您需要使用 CreateObject 并将每个对象定义为 Object

    示例(未经测试):

    Dim sc As Object = CreateObject("Shell32.ShellClass")
    Dim SrcFlder As Object = sc.NameSpace(sourceFilename)
    Dim DestFlder As Object = sc.NameSpace(destinationDirName)
    Dim Items As Object= SrcFlder.Items()
    DestFlder.CopyHere(Items, 16) '16 = Respond with "Yes to All"
    

    请注意,这不会在 Option Strict On 下编译

    但是我会说,您应该尽可能地尝试进行早期绑定。

    【讨论】:

    • 我之前已经尝试过,但仍然收到“无法创建 ActiveX 组件”。在运行时的第 1 行。唯一对我有用的方法是GetTypeFromProdID,然后是CreateInstance
    • 正如你所说,我也更喜欢早期绑定,但在这种情况下,请求的功能似乎很少,所以我不想将 DLL 附加到工具上,因为它原本是作为单个 exe 的。跨度>
    • 早期绑定和后期绑定都需要在目标机器上安装适当的 DLL。
    • 所以如果我理解正确,引用Windows文件夹中的那个就足够了吗?它始终存在于 Windows XP 及更高版本中。
    • 感谢您的回答。 作为记录,我在这里指出,使用 shell 库的解压缩方法在我的 Windows 8 计算机上无法正常工作,解压过程中出现奇怪的错误,无法解压文件。 我必须找到其他一些方法。
    猜你喜欢
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多