Передача массива из управляемого кода в неуправляемый компонент C ++ ActiveX - PullRequest
1 голос
/ 02 июня 2011

В более раннем посте Передача указателя из управляемого C ++ / CLI в компонент ActiveX C ++ Я спросил о правильном способе передачи массива (управляемого или неуправляемого массива) в компонент ActiveX, созданный в nativeC ++.Метод activeX имеет следующую подпись:

short Component::CopyToBuffer(short FAR* ptr) {}

, когда activeX импортируется для использования в C ++ / CLI

подпись метода отображается как

short Component::CopyToBuffer(short% ptr) {}

при импорте в C # он отображается как

short Component::CopyToBuffer(ref short ptr) {}

Однако я не смог правильно передать массив.

независимо от того, является ли собственный массив: short* shortsArray = new short[500];

ниУправляемый массив: array<short>^ shortsArray = gcnew array<short>(500);

Пользователи ildjarn и Ханс Пассант предложили мне отредактировать файл сборки взаимодействия, чтобы изменить подпись экспортированного метода на что-то вроде Component: :( int16 [] ptr), что я и сделал успешноскомпилировал проект, но столкнулся с другими проблемами (несоответствие типов или что-то в этом роде).

Итак, я создал пример проекта, который воспроизводит проблему nSolution
Решение содержит:

  • Проект для компонента ActiveX с одним методом CopyToBuffer, найденный в SomeCompCtl.h
  • Тестовый проект в C ++ / CLI.с единственной формой, к которой добавлен activeX, и кнопка вызывает метод с массивом заданных значений.
  • Другой тестовый проект на C #, который делает то же самое

ToЗапустите проект: - Просто скомпилируйте SomeComp для генерации Somecomp.ocx, который содержит ActiveX.- regsrv32 элемент управления ActiveX

Обратите внимание, что у меня нет доступа к коду ActiveX (у меня был доступ к одной версии кода, но я не могу предположить, что разработчики продолжат предоставлять мне обновленные версиикод), поэтому любые решения не должны зависеть от изменения интерфейсов ActiveX или кода.Обычно у меня есть только файл ocx с файлом tlb.

1 Ответ

0 голосов
/ 03 июня 2011

С подписью как CopyToBuffer(short% ptr) как ты это назвал?Если вы сделали CopyToBuffer(myArray[0]) или CopyToBuffer(&myArray[0]), это может не сработать, поскольку сборщик мусора может переместить массив на вас.Попробуйте это:

pin_ptr<short> pinned = &myArray[0];
component->CopyToBuffer(pinned);

Если это не сработает, попробуйте снова отредактировать файл сборки взаимодействия, измените подпись на CopyToBuffer(IntPtr ptr).Поскольку он более явно говорит о том, что параметр является простым указателем, возможно, он будет работать лучше.

...