Как пройти массив структуров (содержащий std: string или bstr) от ATL к C #. SafearRay? Вариант?
Вопрос
У меня есть объект ATL COM, который я использую из C #. Интерфейс в настоящее время выглядит:
interface ICHASCom : IDispatch{
[id(1), helpstring("method Start")] HRESULT Start([in] BSTR name, [out,retval] VARIANT_BOOL* result);
...
[id(4), helpstring("method GetCount")] HRESULT GetCount([out,retval] LONG* numPorts);
...
[id(7), helpstring("method EnableLogging")] HRESULT EnableLogging([in] VARIANT_BOOL enableLogging);
};
То есть это очень простой интерфейс. У меня также есть некоторые события, которые я тоже отправляю. Теперь я хотел бы добавить что-то в интерфейс. В ATL у меня есть некоторые результаты, которые в настоящее время являются структурой и похоже на структуру Report_line {String CreateDate; идентификатор строки; сводка строки; }; Все члены структуры являются std :: string. У меня есть массив этого, что мне нужно вернуться к C #. Какой лучший способ сделать это?
Я подозреваю, что кто-то скажет: «Эй, ты не можешь просто отправить std :: string of com такой. Если это так, хорошо, но какой лучший способ modidfy структуру? Изменить std :: string to bstr? А потом, как мне, 1) настроить IDL для передачи массива структуров (strenss с bstr или std :: string) 2), если я должен использовать SafearRays, как я могу заполнить Safearrays со структурами.
Я не знаком с COM, за исключением использования с простыми типами.
Решение
Пользовательская структура несовместима с интерфейсом автоматизации. Возможно, вы можете разработать вложенный массив или двумерный безопасный массив BSTRS, но более удобное решение будет обернуть структуру в качестве объекта автоматизации с 3 свойствами, затем оберните массив в качестве коллекции, имеющего перечислитель.
Ни IDL, ни автоматизация определяют байтовое выравнивание для структуры. Таким образом, вы можете иметь проблемы с совместимостью, если ваш COM-сервер имеет разное расчетное выравнивание с клиентом. Например, VB имеет 4-байтовое выравнивание, в то время как #import в Visual C ++ по умолчанию на 8-байтовое выравнивание. Если у вас есть малейший шанс в будущем, чтобы использовать интерфейс в сценарии, избегайте использования структур.
Предлагаемое чтение:
- "Прохождение структур через Idispatch "по дону Box, Microsoft Systems Journal, июнь 1996 года.
- *Принципы проектирования для интерфейсов сбора и перечислителя
- * Intl Internals: Работа с ATL 8 Chris Tavares, Kirk Fertitta Page 392