Главная страница
    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.45 MB
Время: 0.041 c
3-1117024028
evg00
2005-05-25 16:27
2005.07.11
последняя запись


14-1118222987
MadAngel
2005-06-08 13:29
2005.07.11
Посоветуйте цифровик


14-1118515711
Cheater
2005-06-11 22:48
2005.07.11
Подбор ткани для мебели. Какие могут быть решения?


1-1118714581
Viktop
2005-06-14 06:03
2005.07.11
Связи таблиц в D9


4-1115988808
pavlov
2005-05-13 16:53
2005.07.11
Панель задач





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский