Нужно вызвать функцию com из VB.NET - PullRequest
0 голосов
/ 29 ноября 2011

Если кто-то захочет это сделать, я очень ценю это. Я пишу приложение для 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, и я всегда получаю ошибки, такие как «не реализовано» или «параметр неверен». Если кому-то скучно и он захочет написать какой-нибудь код, я с удовольствием предоставлю ему шанс и сообщу.

UPDATE:

Это странно. Посмотрите на этот код:

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 ]

1 голос
/ 29 ноября 2011

Найдите ShadowStor.ShadowProtect в своем реестре в HKCR.У него будет CLSID, который является GUID.Ищите этот GUID, также в HKCR.Вы должны найти его в разделе CLSID.Под этим ключом вы должны найти фактический путь DLL в InprocServer32.

Теперь, если этот компонент имеет встроенную TypeLib, вы сможете добавить ссылку на него в Visual Studio.(Если у вас установлен OLE View, вы также можете легко проверить тип lib).

И если вы не можете добавить ссылку на dll, возможно, существует отдельный файл .tlb, и вы можете найти это, выполнив поиск по GUID, присутствующему в значении TypeLib.

0 голосов
/ 30 ноября 2011

Для всех, кто заинтересовался, решение было Dim volumes() As Object внутри цикла, а затем установить volumes = Nothing в конце цикла, чтобы он каждый раз создавался заново. Если кто-нибудь может объяснить, почему это так, я бы с удовольствием это понял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...