2011-11-29 132 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