У меня есть COM-объект ATL, который я использую из C#. Интерфейс в настоящее время выглядит так:Как передать массив структур (содержащий std: string или BSTR) из ATL в C#. SafeArray? Вариант?
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 у меня есть некоторые результаты, которые в настоящее время являются структурами и выглядят как struct REPORT_LINE { string creationDate; строка Id; строка сводка; }; Все члены структуры std :: string. У меня есть массив из них, что мне нужно вернуться на C#. Каков наилучший способ сделать это?
Я подозреваю, что кто-то скажет: «Эй, вы не можете просто отправить std :: string поверх COM. Если да, то хорошо, но как лучше всего изменить mod? строка в BSTR? И затем, как я, 1) Настройте IDL для передачи массива структур (structs with BSTR или std :: string) 2) Если я должен использовать SAFEARRAYS, как заполнить SAFEARRAYS с помощью структуры.
Я не знаком с COM для использования с простыми типами, за исключением.
Спасибо за быстрый ответ , Я читаю ваши предложения. Один быстрый вопрос: я сыграл еще и смог придумать следующее: интерфейс ISimpl eCom: IDispatch { \t \t [id (1), helpstring («метод Test2»)] HRESULT Test2 ([in, out] Параметр SAFEARRAY (struct MyStruct)); }; , где MyStruct: struct MyStruct { \t \t long nLongValue; \t BSTR bstrStringValue; }; Это отлично работает с C#. Он не должен основываться на ваших предложениях и чтении (или совместим с SAFEARRAY?). C#: SafeArrayPlayLib.MyStruct [] myArray = new MyStruct [2]; com.Test2 (myArray); С уважением, Дэйв – Dave
обновлен на structs –
Спасибо Sheng.Я не буду использовать этот COM-компонент со скриптом, просто C#. Спасибо за помощь. Трудно получить помощь в COM в эти дни; это старая технология. – Dave