Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2012, 11:09   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию Array of ^Integer как подобраться к нужному индексу?

Есть DLL, она экспортит ttt:array of integer, в котором там нужные мне цифорки.
Хочу напрямую читать значения данного массива. Как достать значение по нужному индексу?

Подобный код бьёт по runtime error 216(хотя одно время прекрасно работал ровно с первыми двумя индексами, но не более)
Код:
impttt:array of ^Integer;
pttt:pointer;
....
pttt:=GetProcAddress(H, PWideChar('ttt'));
impttt:=pttt;
showmessage(inttostr(impttt[0]^));
Теперь сделал так после длительной отладки. Длл как обычно:
Код:
var
  ttt:array of Integer;

{$R *.res}
procedure __init;stdcall;
var
  i: Integer;
begin
{setlength(ttt,100);
for i := 0 to 99 do
  ttt[i]:=Random(100);}
setlength(ttt,5);
ttt[0]:=100;
ttt[1]:=55;
ttt[2]:=3535;
ttt[3]:=5050;
ttt[4]:=9999;
end;

exports
__init,ttt;
Импровизированная функция доставания цифр в приложении:
Код:
...
var
  Form1:TForm;
  H:Thandle;
  InitProcLaunch:TProcedure;
  pttt:pointer; //указатель на ttt в dll
....
function getfromdll(tttindex:integer):integer;
var
step:integer;
begin
if tttindex>tttlength then Result:=5999999;  //если индекс вне массива то результат че-нибудь невнятное
step:=tttindex*4;                            //смещение до нужного массива
asm
  mov eax, pttt       //берем указатель  на массив
  mov eax,[eax]      //читаем указатель на значение индекса 0 (ttt[0])
  add eax, step       //прибавляем смещение
  mov eax,[eax]      //читаем значение искомого индекса (ttt[tttindex])
  mov Result,eax     //результат
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i := 0 to tttlength-1 do
  Memo1.Text:=Memo1.Text+inttostr(getfromdll(i));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 H:=LoadLibrary(PWideChar('test.dll'));
 InitProcLaunch:=GetProcAddress(H, PWideChar('__init'));
 InitProcLaunch;
 pttt:=GetProcAddress(H, PWideChar('ttt'));
 asm                      //находим длину массива
  mov eax, pttt        //берем указатель на массив
  mov eax,[eax]       //читаем указатель на значение индекса 0
  sub eax,4             //смещаем указатель назад на 4 байта
  mov eax,[eax]       //читаем размер массива
  mov tttlength, eax //нашли
end;
end;
А если у меня array of array of array of Integer экспортируется из dll, сидеть в деббагинге и так же мудрить. Есть ли нормальный способ спокойно подбираться к таким вот массивам из dll?
WhiskasTM вне форума Ответить с цитированием
Старый 31.08.2012, 11:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ptttointer; //указатель на ttt в dll
А ты его опиши как array of array of array of Integer
Или если это указатель то
Код:
type ttt=array of array of array of Integer
var pttt:^ttt;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2012, 12:08   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты его опиши как array of array of array of Integer
Так выдает рантайм 216, зато второй вариант то что нужно!
Нормальным синтаксом вызывается и просто. Благодарствую!
Код:
Memo1.Text:=inttostr(pttt^[1][4]);
Офф. - Не, пока двух массивов хватит, с тремя жуткая путаница в коде с непривычки))

Последний раз редактировалось WhiskasTM; 31.08.2012 в 12:13.
WhiskasTM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Cardinal или Integer в Array of Bytes alumium Общие вопросы Delphi 4 21.08.2012 17:02
преоброзования Byte Array to Single and Integer mrCloud Общие вопросы Delphi 1 14.06.2011 21:08
Как подобраться к целевой папке? Husuf Операционные системы общие вопросы 4 27.09.2010 11:16
a:array[1..50] of integer; KulOle Паскаль, Turbo Pascal, PascalABC.NET 1 25.12.2008 19:16
задать массив типа X: array [0..N] of integer -где N переменная читаеться из EditBox Kivin13 Общие вопросы Delphi 22 06.09.2007 09:25