Как пройти массив структуров (содержащий std: string или bstr) от ATL к C #. SafearRay? Вариант?

StackOverflow https://stackoverflow.com/questions/2775299

Вопрос

У меня есть объект 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-байтовое выравнивание. Если у вас есть малейший шанс в будущем, чтобы использовать интерфейс в сценарии, избегайте использования структур.

Предлагаемое чтение:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top