2011-11-29 68 views
0

如果有人想对此采取措施,我会非常感激。我正在编写一个VB.NET应用程序来控制商业备份产品。我需要做的一件事就是循环所有现有的工作并查看源驱动器。我能做到这一点在VBScript很干脆这样的:需要从VB.NET调用com函数

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 

这从一个工作显示音量,然后崩溃如果有一个以上的jobwith错误“无效被调用方”。

+0

因为For Each在VBScript中工作,我猜这个类型是某种类型的集合。你的COM库是否包含任何集合类型? – GTG

+1

有点没有意义的发布代码的作品。发布代码*不起作用*。 –

+0

当你说'没有什么我尝试在VB> NET作品'你是什么意思?你有错误吗?在编译时?在运行时? –

回答

0

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

1

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

现在,如果该组件具有嵌入式TypeLib,则应该能够在Visual Studio中添加对其的引用。 (如果你安装了OLE View,你也可以很容易地检查类型lib)。

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

+0

谢谢。 ShadowStor.ShadowProtect实际上是软件安装的Windows服务。我可以在对象浏览器中打开服务exe文件并查看所有的类和成员,但根本没有记录。 –

+0

查看更新的问题。 –

+0

一旦您引用了ShadowStor.ShadowProtect,您是否在创建的对象上获得了Intellisense?希望不需要在VB.NET中使用'CreateObject'。 – tcarvin