Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамические массивы в dll [D7, Win2k]


bma_ru ©   (2005-06-11 16:48:00) 

Привет.
На Delphi 7 написана dll, необходимо в главное приложение передать динамический массив.
При работе с массивом приложение падает. Научите как правильно, пожалуйста. Можно свой пример покороче.
ShareMem в dll стоит. Позже главное приложение будет написано на MFC.

type
pLinesName=^TLinesName;
TLinesName = record
 Enabled: LONGWORD;
 Name: array of WORD;
End;

В dll:
объявлена:
procedure GetCountLinesName(AFormRef:LongInt; var Count:Word); StdCall; //размер динамического массива
procedure GetLinesName(AFormRef:LongInt;  var pRec:pLinesName); stdcall;

реализация:
procedure GetCountLinesName(AFormRef:LongInt; var Count:Word);
begin
Count:=TDLLForm(AFormRef).StringGrid1.RowCount-1;
end;

procedure GetLinesName(AFormRef:LongInt; var pRec:pLinesName);
var
i:integer;
Count:Word;
begin
if TDLLForm(AFormRef).Start1.Checked=True then pRec^.Enabled:=1 else
   pRec^.Enabled:=0;
Count:=TDLLForm(AFormRef).StringGrid1.RowCount-1;
for i:=0 to Count-1 do
  pRec^.Name[i]:=Hex2Dec(TDLLForm(AFormRef).StringGrid1.Cells[0,i+1]);
end;

В главном приложении.
объявлена:
procedure GetLinesName(AFormRef:LongInt; var pRec:pLinesName); StdCall external 'debug_me.dll';
procedure GetCountLinesName(AFormRef:LongInt; var Count:Word); StdCall external 'debug_me.dll';

реализация:
procedure TForm1.Button3Click(Sender: TObject);
var
pRec: pLinesName;
i:integer;
SizeGLN:Integer;
Count:Word;
begin
 Count:=0;
 GetCountLinesName(hForm, Count);
 SizeGLN:=SizeOf(LONGWORD)+SizeOf(Word)*Count;
 GetMem (pRec, SizeGLN);
 try

 SetLength(pRec^.Name, Count); //ПАДАЕМ! Exception!!!

 GetLinesName(hForm, pRec);
 StringGrid1.RowCount:=Count+1;
  for i:=0 to Count-1 do
   begin
    StringGrid1.Cells[0, i+1]:=IntToHex(pRec.Name[i], 4);
   end;
 finally
  FreeMem(pRec, SizeGLN);
 end;
end;


Amoeba   (2005-06-14 15:16:00) [1]


> О дин. массивая в понимании Delphi.

Естествено это и имелось в виду.


TUser   (2005-06-14 15:12:00) [2]

> А в этом случае придется забыть о динамических массивах.

О дин. массивая в понимании Delphi. Выделять память через GetMem/Re/M/AllocMem/ect


Amoeba   (2005-06-14 15:10:00) [3]

Выделять память под pRec следует через New(pRec), а освобождать через Dispose(pRec).


> Позже главное приложение будет написано на MFC.

А в этом случае придется забыть о динамических массивах.


Наверх

Титульная страница Поиск, карта сайта Написать письмо