需要从VB.NET调用com函数

时间:2011-11-29 13:11:55

标签: vb.net com vbscript

如果有人想对此采取行动,我会非常感激。我正在编写一个控制商业备份产品的VB.NET应用程序。我需要做的一件事是遍历所有现有作业并查看源驱动器。我能够在VBScript中完成这个,就像这样:

Dim SP, BackupJob, volumes
Set SP = CreateObject("ShadowStor.ShadowProtect")
For Each Job In SP.Jobs
    Set BackupJob = SP.Jobs.GetBackupJob(Job.Description)
    BackupJob.GetVolumes volumes
    For Each Volume in volumes
        WScript.Echo volume
    Next
Next
Set SP = Nothing

然而,我在VB.NET中尝试的无效。我很确定它与com函数返回变量数据类型和数组(特别是GetVolumes)这一事实有关。我已经尝试使用字符串数组,对象数组,甚至将返回值包装在VariantWrapper中,并且我总是会遇到诸如“未实现”或“参数不正确”之类的错误。如果有人觉得无聊并想写一些代码,我很乐意给它一个机会并报告回来。

更新:

这很奇怪。看看这段代码:

Dim SP As Object = CreateObject("ShadowStor.ShadowProtect")
Dim gotJob As Object
Dim volumes() As Object

Try
    For Each Job As Object In SP.Jobs
        gotJob = SP.Jobs.GetBackupJob(Job.Description.ToString())
        gotJob.GetVolumes(volumes)

        For Each volume As Object In volumes
            MsgBox(volume.ToString())
        Next

    Next

Catch ex As Exception
    MsgBox(ex.Message)
End Try

这将显示来自一个作业的音量,然后如果有多个作业并且出现错误“无效的被叫者”,则会崩溃。

2 个答案:

答案 0 :(得分:1)

在HKCR的注册表中找到ShadowStor.ShadowProtect。它将具有一个GUID的GUSID。在HKCR中搜索该GUID。您应该在CLSID部分找到它。在该键下,您应该在InprocServer32下找到实际的dll路径。

现在,如果该组件具有嵌入式TypeLib,您应该能够在Visual Studio中添加对它的引用。 (如果安装了OLE View,则可以轻松检查类型lib)。

如果你不能添加对dll的引用,可能会有一个单独的.tlb文件,你可以通过搜索TypeLib值中的GUID来找到它。

答案 1 :(得分:0)

对于任何感兴趣的人,解决方案是在循环内部Dim volumes() As Object,然后在循环结束时设置volumes = Nothing,以便每次都重新创建它。如果有人能解释为什么会这样,我很乐意理解它。