2010-02-24 3 views
1

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

Например, 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, который реализует определенный интерфейс, мне нужно будет вызывать методы на нем или создавать экземпляр объекта, если это строка.

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

+0

Почему бы не использовать вариант? –

+0

Просто, чтобы быть уверенным. В коде vb есть метод, принимающий строковый аргумент, но когда вы извлекаете IDL из .dll, похоже, что методы берут IDispatch вместо этого? –

+0

@Alexandre - да, IDL (который был снабжен источником VB - я его не извлекал) показывает метод, использующий IDispatch *, но сам код VB объявляет параметр как строку. В примерах JScript используется как строка, так и интерфейс, как описано. – Rob

ответ

1

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

0

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

Dim str As String 
    str = obj 

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

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

    MyFunc obj 

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

Смежные вопросы