![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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));Если коротко и словами, то все уперлось в то что к массивам нужно обращаться через указатель.  |