Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Marshaling бинарного массива произвольной длины / 13 сообщений из 13, страница 1 из 1
05.03.2005, 16:55
    #32948713
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Народ, срочно нужно разобраться.. HEELP!
Как в функцию в unmanaged dll передать указатель на массив БИНАРНЫХ данных неизвестного заранее размера?
Всякие [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=MAX_PATH )] не прокатывают, видимо.. Та библа есть на делфи, я его не знаю - сделал параметры PByteArray вместо PChar - так надо. До этого преобразования проблем, ессесно, не было. Просто надо не только текст передавать.
Как заделать сабж?

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 17:28
    #32948770
Стр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
немного непонятно "неизвестного заранее размера" и направление: передать туда/получить обратно ?

например, для передачи массива байт в библитеку (туда):
Код: plaintext
1.
[DllImport("DelphiLib.dll")]
public extern static void Func(byte[] array);
...
Рейтинг: 0 / 0
05.03.2005, 17:52
    #32948817
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Окучиваю SPGP. Там входящий буфер был только текстовым - я переделал на бинарный, естественно, окучив тело функции (надеюсь, что верно)

function spgp_encode(BufferIn, BufferOut: PChar; BufferOutLen: LongInt;...): LongInt;stdcall;export;
превратилась в
function spgp_encode(BufferIn: PByteArray; BufferInLen: LongInt; BufferOut: PByteArray; BufferOutLen: LongInt; ...): LongInt;stdcall;export;

Надо вызывать ее из С#.
Вопроса два - как правильно сделать [DllImport]
и как правильно вызвать.


-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 17:55
    #32948824
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
т.е. нормально работало

[ DllImport( "spgp.dll", EntryPoint="spgpuiencode", CharSet=CharSet.Ansi )]
public static extern int spgpUIEncode (
StringBuilder BufferIn,
StringBuilder BufferOut,
int BufferOutLen,
...);

и при вызове передавал заделанные StringBuilder с завершающим нулем (а в библиотеке длина входящего буфера определялась соответственно)

теперь же - ХЗ! как ни тыркаюсь - не прокатывает

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 18:15
    #32948859
Стр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
посмотрел описание (если правильно нашел) - там речь идет только о строках и никаких двоичных данных - нет.
может тебе сделать преобразование (самое легкое, по Base64) данных в строку ???
а при расшифровке - в обратную сторону ...
...
Рейтинг: 0 / 0
05.03.2005, 18:22
    #32948873
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
там - это где? в PGP - нет! Неужели так проблемно передать указатель на кусок памяти некоего размера наружу из C#???

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 18:26
    #32948880
Стр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Смотри мой первый ответ - это как раз и есть передача указателя на последовательность байт в памяти. Как видишь - просто, по самое не могу :)
...
Рейтинг: 0 / 0
05.03.2005, 18:38
    #32948891
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Можно примерчик импорта и вызова? По-моему, в доке ясно написано, что не получится смаршалить массив неизвестной длины. Делается это как-то через Ж.. а может я не прав. А пока я поменял в исходниках тип буферов на простой Pointer (гадаю на кофейной гуще :). Шаманю..

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 18:44
    #32948895
Стр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
[DllImport("DelphiLib.dll")]
public extern static void Func(byte[] array);

byte[] ar=new byte[1024]; // выделяешь массив нужной тебе длины
...
// заполнение массива данными		
...
Func(ar); // отмаршалит в указатель на кусок памяти 1024 байт 
...
Рейтинг: 0 / 0
05.03.2005, 18:49
    #32948899
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Не выходит :(
мож по аське ?
32564604

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 18:59
    #32948906
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Маршалится-то маршалится видимо.. стабильно выдает ошибку kPGPError_BadParams

Смотрю эту функцию:
function spgpuiencode(
BufferIn : Pointer;
BufferInLen : LongInt;
BufferOut : Pointer;
BufferOutLen : LongInt;
Encrypt : LongInt; ........)
и буфер дальше используется только в

PGPOInputBuffer(Context, BufferIn, BufferInLen), где он описан в апи как VOID*

что за фигня..

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
05.03.2005, 19:05
    #32948914
Стр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Ты можешь дать ссылку на описание библиотеки ?
Нашел только:
http://www.oz.net/~srheller/spgp/funcref/encrypt.html

spgpspgpEncode
Encrypt and/or sign text using conventional or public-key encryption.
spgpUIEncode
An alternative version of spgpEncode which uses PGP's user-interface dialogs to gather information about keys and passphrases. PGP 6.x only. Нет там даже упоминания о шифровании двоичных данных.
...
Рейтинг: 0 / 0
14.03.2005, 12:48
    #32958545
(`yka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Marshaling бинарного массива произвольной длины
Все заработало. Не пойму, где была проблема.. Просто взяло и заработало. А насчет SPGP - я ее подделал, чтоб с бинарными буферами работала. И еще кой чего подделал. spgpAnalyze.. криво работали. В общем, спасибо ;)

-----
Иногда решительный шаг вперед - результат хорошего пинка сзади
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Marshaling бинарного массива произвольной длины / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]