Преобразовать IDispatch * в строку? - PullRequest
1 голос
/ 24 февраля 2010

Я конвертирую старый VB COM-объект (который я не писал) в C ++, используя ATL. Один из методов, согласно IDL, принимает IDispatch* в качестве параметра, а документация и примеры для этого метода утверждают, что вы можете передать либо строку (которая является progid объекта, который будет создан и использован control) или IDispatch* для объекта, который уже был создан. Как же я могу реализовать это в ATL?

Например, IDL:

[id(1)] HRESULT Test(IDispatch* obj);

Сэмплы (все они в формате JScript):

obj.Test("foo.bar");

или

var someObject = new ActiveXObject("foo.bar");
obj.Test(someObject);

Чтобы еще более усложнить ситуацию, фактический код VB, реализующий этот метод, фактически объявляет параметр 'obj' в виде строки! Однако, похоже, все работает.

Можете ли вы даже передать строку в метод COM, который принимает IDispatch*? Если да, могу ли я определить, что IDispatch* на самом деле строка в моем C ++ ATL-коде? Еще лучше, если это IDispatch, который реализует определенный интерфейс, я захочу вызвать методы или создать экземпляр объекта, если это строка.

Любые идеи приветствуются!

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

Объявите метод так, чтобы он принимал аргумент VARIANT, и проверяйте фактический тип во время выполнения.

0 голосов
/ 01 марта 2010

Если у вас есть экземпляр obj класса VB6 Class1 и вы пытаетесь присвоить его примитивному типу, подобному этому

    Dim str As String
    str = obj

... then оценивается свойство Class1 по умолчанию. То же правило применяется к вызовам методов

Function MyFunc(str As String)
   ...
End Function

   MyFunc obj

Последний вызов метода будет успешным, только если Class1 имеет определенное свойство по умолчанию и значение свойства obj по умолчанию может быть приведено к String.

...