Я преобразовываю старый объект 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
, который реализует определенный интерфейс, мне нужно будет вызывать методы на нем или создавать экземпляр объекта, если это строка.
Любые идеи приветствуются!
Почему бы не использовать вариант? –
Просто, чтобы быть уверенным. В коде vb есть метод, принимающий строковый аргумент, но когда вы извлекаете IDL из .dll, похоже, что методы берут IDispatch вместо этого? –
@Alexandre - да, IDL (который был снабжен источником VB - я его не извлекал) показывает метод, использующий IDispatch *, но сам код VB объявляет параметр как строку. В примерах JScript используется как строка, так и интерфейс, как описано. – Rob