Текущий архив: 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.45 MB
Время: 0.041 c