В более раннем посте Передача указателя из управляемого 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.