Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/10: Рейтинг темы: голосов - 10, средняя оценка - 4.60
ZSi
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 6
1

Пердача byte[] COM-функции, ожидающей ref byte

21.09.2010, 21:45. Просмотров 1801. Ответов 13
Метки нет (Все метки)

Привет,

наше приложение в C# использует несколько COM-интерфейсов. В одном из них есть метод, которому передается ref byte :
C#
1
writeToStream(ref byte Stream, ref uint size)
в документации к методу сказано, что Stream должен быть нечто вроде byte[] или стэка, куда будет записана информация. Вопрос в том, как передать byte[] этому методу?

Спасибо заранее!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2010, 21:45
Ответы с готовыми решениями:

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE...

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной...

wav byte[] в flac byte[]
Ситуация такая: С микрофона каждую 0.1 сек идет byte где то по 3к значений....

byte[]---->GIF
Всем привет. Столкнулся с маленькой проблемкой. Сокет получает массив byte(это...

double в byte[]
В проекте преобразование из byte в double осуществляется следующим образом: ...

13
tasty_sock
133 / 131 / 21
Регистрация: 26.01.2010
Сообщений: 350
21.09.2010, 22:14 2
Точно ref byte Stream, а не ref byte[] Stream?
0
ZSi
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 6
21.09.2010, 22:18  [ТС] 3
Цитата Сообщение от tasty_sock Посмотреть сообщение
Точно ref byte Stream, а не ref byte[] Stream?
100%, в этом-то и проблема!
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
21.09.2010, 23:25 4
Можете привести точный текст из документации? Может нужно передать указатель на byte[]...
0
ZSi
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 6
21.09.2010, 23:31  [ТС] 5
Цитата Сообщение от SSTREGG Посмотреть сообщение
Можете привести точный текст из документации? Может нужно передать указатель на byte[]...
Я тоже предполагаю, что речь тут идет об указателе. Сам метод в соответствующем C++ interface получает byte * Stream в качестве аргумента. Вот только в COM это переведено как ref byte...

Точную цитату из доку смогу добавить только завтра с работы
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
21.09.2010, 23:43 6
Цитата Сообщение от ZSi Посмотреть сообщение
byte * Stream
Это указатель на начало буфера. Попробуйте:
C#
1
2
3
4
5
byte[] buff = new byte[100]; // Предположим что он заполнен...
IntPtr pBuff = Marshal.AllocHGlobal(buff.Length);
Marshal.Copy(buff, 0, pBuff, buff.Length);
// Здесь вызов метода из интерфейса, только у него параметр должен быть IntPtr вместо byte.
Marshal.FreeHGlobal(pBuff);
0
ZSi
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 6
21.09.2010, 23:49  [ТС] 7
я попробую завтра, спасибо!
Цитата Сообщение от SSTREGG Посмотреть сообщение
C#
1
// Здесь вызов метода из интерфейса, только у него параметр должен быть IntPtr вместо byte.
А не будет компилятор возмущаться, что ему передают IntPtr вместо byte?
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
21.09.2010, 23:51 8
Ну тут я не знаю ) Надо пробовать.
0
ZSi
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 6
22.09.2010, 11:56  [ТС] 9
ok, спасибо!

Добавлено через 11 часов 58 минут
Цитата Сообщение от SSTREGG Посмотреть сообщение
Ну тут я не знаю ) Надо пробовать.
Ничего не выходит. Компилятор жалуется, что IntrPtr должен бытъ byte. Если я делаю (byte)IntPtr, то что должен бытъ assignable.

Точный IDL этого метода выглядит так :
C++
1
2
3
4
5
6
7
/// Writes a message to a byte stream
/**
 @param pMsg        Message which should be serialized.
 @param pStream     Byte array the message should be serialized to.
 @param pSize       Size of byte array pStream in byte;
*/      
HRESULT WriteMsgToStream([in]IMsg *pMsg, [in] byte *pStream, [in,out] UINT* pSize);
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
22.09.2010, 18:23 10
А как Вы его объявляете на C#?
0
ZSi
0 / 0 / 0
Регистрация: 21.09.2010
Сообщений: 6
22.10.2010, 00:53  [ТС] 11
Времени уже много прошло, но все равно расскажу, как проблема была разрешена.

Дело в том, что нам были предоставлены готовые tlb-библиотеки, которые мы регистрировали и таким образом получали доступ к COM-интрефейсам как assembly в visual studio.

Так вот, tlb-файлы создаются автоматически MIDL, причем иногда аргументы в методах генерируются неверно, как в описаном выше случае. Т.е. желательно было бы получить в качестве аргумента INtPtr, конечно.

Дальше все дело техники. Описание здесь: http://msdn.microsoft.com/en-us/libr...agemsilanchor1

В моем случае надо было поменять в IL-файле тип аргумента
C
1
[in] int32
на
C
1
 [in] native int
.
После этого снова сгенерировать dll, не регистрировать, а напрямую указать как assembly в c#-проекте и получить обновленный метод с аргументом типа IntPtr.
0
sigmov
575 / 362 / 61
Регистрация: 22.07.2009
Сообщений: 873
Записей в блоге: 4
Завершенные тесты: 2
22.10.2010, 07:33 12
Цитата Сообщение от ZSi Посмотреть сообщение
наше приложение в C# использует несколько COM-интерфейсов. В одном из них есть метод, которому передается ref byte :
C#
1
writeToStream(ref byte Stream, ref uint size)
в документации к методу сказано, что Stream должен быть нечто вроде byte[] или стэка, куда будет записана информация. Вопрос в том, как передать byte[] этому методу?
ref byte это эквивалент char*

Скорее всего вызывать нужно так:
C#
1
2
3
4
5
6
7
uint size = 10000;
byte[] buff = new byte[size]; 
writeToStream(ref buff[0], ref size)
//если нужно дополнить поток
uint index = 100;
size -=index;
writeToStream(ref buff[index], ref size)
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
22.10.2010, 15:13 13
Цитата Сообщение от sigmov Посмотреть сообщение
ref byte это эквивалент char*
В корне неверно, хотя бы потому, что byte = 1 байт а char = 2 байта.
0
sigmov
575 / 362 / 61
Регистрация: 22.07.2009
Сообщений: 873
Записей в блоге: 4
Завершенные тесты: 2
22.10.2010, 15:33 14
Цитата Сообщение от SSTREGG Посмотреть сообщение
В корне неверно, хотя бы потому, что byte = 1 байт а char = 2 байта.
Да ну? )))
Мы же здеся говорим про COM. А COM содержит native код.
Аналогом System::Char в native служит wchar(unicode) и он занимает 2 байта. А вот аналогом nativ'ского char(ANSI и 1 байт памяти) в NET служит соответсвенно System::Byte. )))

Хотя конечно же мне следовало упомянуть что *char относилось именно к native
0
22.10.2010, 15:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2010, 15:33

FileStream to byte[]
У меня есть функция для декрипта файла с помощью AES. private static...

int в byte
как перевести int в byte а потом обратно в int???

Timestamp to byte[]
Добрый день! Случилась необходимость посчитать количество секунд с 1 января...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru