Главная страница
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.032 c
14-1118392610
pavel_guzhanov
2005-06-10 12:36
2005.07.11
Это что, смена ценностей?


8-1109878979
capkoh
2005-03-03 22:42
2005.07.11
PNG на форме...


1-1119449605
harisma
2005-06-22 18:13
2005.07.11
Вопрос по PageControl


1-1119514369
sofa
2005-06-23 12:12
2005.07.11
Как сделать службу


14-1118378367
Gamer
2005-06-10 08:39
2005.07.11
СПАМЕР НАЙДЕН