如果有人想对此采取行动,我会非常感激。我正在编写一个控制商业备份产品的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
这将显示来自一个作业的音量,然后如果有多个作业并且出现错误“无效的被叫者”,则会崩溃。
答案 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
,以便每次都重新创建它。如果有人能解释为什么会这样,我很乐意理解它。