Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Динамические массивы в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.038 c
14-1118212934
вразлет
2005-06-08 10:42
2005.07.11
Ukraine under attack


1-1118293585
AndreW1
2005-06-09 09:06
2005.07.11
hint в выпадающем списке Combobox


4-1116157816
A№t0№
2005-05-15 15:50
2005.07.11
Добавление записи в контекстное меню файлов


3-1117434692
silvestr
2005-05-30 10:31
2005.07.11
Как подключиться к удалёной базе MS SQL 2000 - MSDE


4-1116142626
Керик
2005-05-15 11:37
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский