Vijay533 Ответов: 2

Передача структурного массива из C# в C++


Привет ,

Я передаю структурный массив из C# в (написанный на c++)com dll,
Я передаю как ref a[1], массив содержит несколько значений (a[2],a[3] содержит данные), в то время как я читаю данные из COM dll, он дает только данные a[1], Если я пытаюсь прочитать a[2], он дает некоторое мусорное значение.


Примечание: Я выделил память с помощью оператора new ((structure type) [] a = new (structure type) [5];)

Ex: int []a = new int[5];


Кто-нибудь может помочь мне, как передать данные из C# в COM dll.

Что я уже пробовал:

Я попробовал передать его как функцию (a[1], selecteditem, 0)

Выше функция com dll загружается в c# по ссылке, для этой функции мне нужно передать данные из c#.

2 Ответов

Рейтинг:
1

Praveen Kumar Katiyar

Пожалуйста, смотрите этот блог
Изменение массива структур (маршалинг по умолчанию)[^]

надеюсь, это поможет.

- Правин.


Рейтинг:
0

KarstenK

Основная проблема заключается в расположении памяти в разных средах выполнения, поэтому мой первый и жесткий совет-использовать в таких структурах только собственные значения (int, double и char []). Вы не можете переносить предметы!!!
Во-вторых, передача только для чтения, что означает, что каждая среда выполнения копирует значения одно за другим.

Прочитай моя статья для таких интерфейсов нужно покопаться в источнике. Вы не предоставили достаточно подробностей своей структуры.


Vijay533

Спасибо за ответ карстенк,
Ниже приведены детали, связанные с кодом.
typedef struct tagOFFICEITEM
{
BSTR MS_TITLE;
BSTR MS_AUTHOR;
BSTR MS_COMPANY;
BSTR MS_DATE_CREATED;
BSTR MS_DATE_MODIFIED;
BSTR MS_TIME_MODIFIED;
BSTR MS_FROM;
BSTR MS_TO;
BSTR MS_CC;
BSTR MS_BCC;
BSTR MS_SUBJECT;
BSTR MS_SENT;
BSTR MS_TIME_SENT;
BSTR MS_RECEIVED;
BSTR MS_TIME_RECEIVED;
BSTR MS_TIME_CREATED;
Имя BSTR;
Вложения BSTR;
давно вернулись;
} OFFICEITEM;

Это моя структура. Я разрабатываю VSTO adding с использованием C#, из c# мне нужно передать вышеуказанные значения структуры в COM-библиотеки DLL(написанные на C++).

Ниже приведена функция, которую я использую в c++
passMsOffice(tagOFFICEITEM* docs, LONG nTotalItems,LONG hWnd (not rewured this is 0))