2013-06-04 1 views
1

У меня есть модуль A в управляемом C++, это зависит от модуля B в родном C++, который завершен как COM plus. В модуле B я читаю байты из файла. Теперь я пытаюсь вызвать функцию чтения файла с A. Но не удалось.Как получить байты в управляемом проекте C++ из проекта COM plus

Деталь зависимости: Я использовал tlbimp.exe и сгенерировал взаимодействие в соответствии с модулем B. Обратные ссылки на interop.

Я попытался передать «массив ^», но был получен только один символ, что понятно, потому что маршалинг не знает длину массива и не может обрабатывать весь массив.

Я искал некоторые рекомендации по безопасному массиву, но не смог использовать его в моих проектах. Может ли кто-нибудь помочь мне в этом?

Большое спасибо.

+0

Вы можете использовать IStream вместо передачи байтов. –

+0

Так что мне нужно реализовать IStream в модуле B и экспортировать его в A? И создать объект потока в модуле A с экспортированным типом из B? – Cesc

+0

Что-то в этом роде. Вы даже можете повторно использовать существующий .NET IStream, созданный специально для встроенного взаимодействия (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comtypes.istream.aspx) –

ответ

0

Если вы собираетесь разговаривать с вашим собственным объектом через COM, вам придется передать массив COM-способом.

SAFEARRAY определенно будет работать, но вам не обязательно использовать его. В любом случае, это достаточно много работы. Если ни один из компонентов не является языком сценариев или VB6, мало смысла использовать SAFEARAY.

COM может массировать массив просто отлично, вам просто нужно сказать, насколько он большой. Двумя наиболее распространенными механизмами в COM для передачи (родных) массивов являются «массивы фиксированного размера» и «сопоставимые массивы».

Если вы знаете, во время компиляции размер массива, это путь. Объявите свой COM-метод следующим образом в IDL:

... 
const long ARRAY_SIZE = 1024; 
... 
HRESULTS MethodAbc(MyClass array[ARRAY_SIZE]); 

Marshalling позаботится о передаче всего массива.

Вы объявляете их следующим образом в IDL:

HRESULT MethodAbc([size_is(arraySize)] MyClass array[], long arraySize); 

Это говорит COM, что параметр ARRAYSIZE держит количество элементов.

Мой опыт работы с CLI минимален, но я не думаю, что вы можете просто передать ручку CLI. Помимо всего прочего, я считаю, что вам нужно привязать указатель так, чтобы GC не перемещал массив во время COM-вызова. Другие, пожалуйста, поправьте меня здесь, если я ошибаюсь.

+0

Спасибо за ваши предложения! Я выбрал «Conformant Arrays» для своих массивов, но: 1.Вы предлагаете работу, если A и B работают в одном и том же процессе; 2. Это не работает, если A и B работают в разных процессах; К сожалению, мой модуль B находится в стандарте COM + и работает в другом процессе с модулем A. Что еще мне нужно сделать, чтобы использовать способ «Conformant Arrays»? Или мне нужно выбрать новый способ обработки неподходящего процесса? – Cesc

+0

@ user2451353, какого типа/класса является массив? Вы используете пользовательский маршалинг? –

+0

Это массив ^, не произвольный маршалинг. – Cesc

 Смежные вопросы

  • Нет связанных вопросов^_^