Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Динамические массивы в dll   Найти похожие ветки 

 
bma_ru   (2005-06-11 16:48) [0]

Привет.
На 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:10) [1]

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


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

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


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

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

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


 
Amoeba ©   (2005-06-14 15:16) [3]


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.064 c
1-1119431432
Darkwing
2005-06-22 13:10
2005.07.11
Создание файла больше 4 ГБ.


3-1117607493
r9000
2005-06-01 10:31
2005.07.11
Внесение текстового файла в поле базы MySQL


4-1116062353
LaMaX
2005-05-14 13:19
2005.07.11
Проблема с буфером для вывода текста в различных режимах


11-1102443019
lse
2004-12-07 21:10
2005.07.11
шифрование


14-1118309641
boriskb
2005-06-09 13:34
2005.07.11
Ностальгия :)