|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
DLL C# и передача через Pointer
Всем здравствуйте. Если обрисовать покороче, то ситуация такая:
есть DLL от стороннего разраба и пример на C# к ней. все шло замечательно, но уперся в получении данных из одной функции, сам я в шарпе шарю на интуитивном уровне, а целый день гугления больше запутал, чем прояснил. Может вы подскажите? функция вызываемая из DLL описана так: Код:
/************** return >0 ok, return length =0, no result. <0 return (need len) *********/ [DllImport("someDLL.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int someFunc(IntPtr A0, int[] A1, int[] A2, IntPtr B, int Len); Я в Delhi описал ее так: Код:
function someFunc(A0: Pointer; A1, A2: array of Integer; B:Pointer; Len: Integer): Integer; cdecl; external 'someDLL.dll'; Код:
int r = 0; int[] a2 = new int[2]; int[] a1 = new int[2]; int len = 65535; IntPtr aB; aB = Marshal.AllocHGlobal(len); r = someFunc(a0, a1, a2, aB, len); if (r > 0) { switch (a2[0]) { case (int)SOME_CONST: { SomeRecord rec; r = (SomeRecord)Marshal.PtrToStructure(aB, typeof(SomeRecord)); Код:
var r: Integer; a2: array[0..1] of Integer; a1: array[0..1] of Integer; aB: Pointer; len: Integer; rec: SomeRecord; begin r := 0; len := 65535; aB := nil; aB:= AllocMem(len); //a0 - глобальная переменная, с ней проблем нет, //иначе библиотека выкинет исключение r := someFunc(a0, a1, a2, aB, len); if(r > 0)then case a2[0] of SOME_CONST: begin CopyMemory(@rec, aB, SizeOf(rec)); Может кто знает что я делаю не так? |
#2
|
|||
|
|||
Победа! Тема Закрыта!
Короче оказалось что работа с массивами в Делфях и Шапре отличаются маленько, для делфей решение оказалось таким:
Описание Код:
function someFunc(A0, A1, A2, B: Pointer; Len: Integer): Integer; cdecl; external 'someDLL.dll'; Работа Код:
var r: Integer; a1, a2: array[0..0] of Integer; aB: Pointer; len: Integer; rec: SomeRecord; begin r := 0; len := 65535; aB := nil; aB:= AllocMem(len); //a0 - глобальная переменная, с ней проблем нет, //иначе библиотека выкинет исключение r := someFunc(a0, @a1[0], @a2[0], aB, len); if(r > 0)then case a2[0] of SOME_CONST: begin CopyMemory(@rec, aB, SizeOf(rec)); Если коротко и словами, то все уперлось в то что к массивам нужно обращаться через указатель. |