Всем здравствуйте. Если обрисовать покороче, то ситуация такая:
есть 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));
Мне функция возвращает меньше нуля, а я понять не могу почему.
Может кто знает что я делаю не так?