COM-интерфейс c # маршалинг массив массивов - PullRequest
0 голосов
/ 24 октября 2018

У меня есть COM-сервер, написанный на C ++, который должен взаимодействовать с клиентом, написанным на C #.COM-сервер C ++ экспортирует интерфейсные функции в структуру, которая содержит массив структур с массивом внутри

struct InnerStruct  { int innerArray[ 100 ]; }
struct OuterStruct  { int dummy; InnerStruct outerArray[ 2 ]; }

Таким образом, структуры имеют фиксированный размер.

Описание IDL:

HRESULT SetStruct( [in] const OuterStruct* par, [out, retval] int code );
HRESULT GetStruct( [out] OuterStruct* par, [out, retval] int code );

IDL компилируется нормально, и я вижу структуру в клиенте C #.

Проблема в том, что когда я вызываю функции интерфейса из клиента C #, я получаю / устанавливаю значения только в первомInnerStruct в OuterStruct.Второй InnerStruct содержит только мусор.

Отладчик C # показывает правильную структуру для OuterStruct и знает, что в OuterStruct есть 2 InnerStruct.

В C # объявление интерфейсных функций происходит отметафайл сервера, поэтому изменить описание нелегко.

Я попытался установить size_is () для параметров in и out, но компилятор MIDL этого не примет.

МожетЯ настроил какой-то конкретный маршалинг на параметры или как мне решить проблему получения полного OuterStruct через COM?

1 Ответ

0 голосов
/ 25 октября 2018

В моем файле IDL я попытался написать

typedef [transmit_as(OuterStructAliasType)] OuterStruct* HelpType;

и сохранить другие объявления как

HRESULT SetStruct( [in] const OuterStruct* par, [out, retval] int code );
HRESULT GetStruct( [out] OuterStruct* par, [out, retval] int code );

, где в моем коде C ++ я определил

typedef struct OuterStructAliasType
{
    char    dummy[ sizeof( OuterStruct )];
} OuterStructAliasType;

Кажется, это работает.Там, возможно, есть другие способы, чтобы обмануть.Пожалуйста, скажите мне, что они умнее или лучше.

...