![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Всем здравствуйте. Если обрисовать покороче, то ситуация такая:
есть 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));Если коротко и словами, то все уперлось в то что к массивам нужно обращаться через указатель. |