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

Вниз

dll и программа   Найти похожие ветки 

 
de.   (2007-06-26 09:46) [0]

Необходимо dll- ки передовать целый ряд параметров:

...
type
 TCnst = record
   MaxHeight, MaxWidth: Integer;
   MinHeight, MinWidth: Integer;
 end;

 tpHandBook = (thbAbonent, thbPlace, thbPoint, thbTpPoint, thbStreet, thbTpStreet);

 THandBook = record
   Tp: tpHandBook;
   Left, Top: Integer;
   Height, Width: Integer;
   Cnst: TCnst;
   WinState: TWindowState;
   Caption: String;
 end;
...
procedure CreateFormDLL(Application, Rec: THandBook);
...

Как мне распознать этот тип в dll- ки, необходимо затать такойже тип.?


 
Desdechado ©   (2007-06-26 09:55) [1]

1. В DLL должны быть описаны идентичные типы.
2. Использовать ShareMem


 
Однокамушкин   (2007-06-26 09:55) [2]


> de.   (26.06.07 09:46)  
> Как мне распознать этот тип в dll- ки, необходимо затать
> такойже тип.?

Да, причём лучше выполнить два условия:

1. Описать этот тип в отдельном модуле и использовать этот модуль и в программе, и в dll, чтобы не ошибиться, описывая один и тот же тип в разных местах...

2. В тексте этого модуля явно указать, как будут выравниваться поля в рекорде, используя packed record или директиву {$A} (она же {$ALIGN}), чтобы разные настройки проектов программы и dll не приводили к тому, что типы будут определены по-разному...

И про ShareMem нее забывайте, а то у вас стринговое поле в рекорде есть...


 
de.   (2007-06-26 10:01) [3]


> И про ShareMem нее забывайте, а то у вас стринговое поле
> в рекорде есть...

Да я его PChar .делаю. :-)
А вот на этом по подробней можно.?

2. В тексте этого модуля явно указать, как будут выравниваться поля в рекорде, используя packed record или директиву {$A} (она же {$ALIGN}), чтобы разные настройки проектов программы и dll не приводили к тому, что типы будут определены по-разному...

?


 
Ega23 ©   (2007-06-26 10:05) [4]


> Да я его PChar .делаю. :-)


C PChar аккуратнее. Не забывай корректно память под него выделять и потом освобождать.


 
Однокамушкин   (2007-06-26 10:11) [5]


> de.   (26.06.07 10:01) [3]
> Да я его PChar .делаю. :-)

И с PChar без ShareMem могут вылезти те же проблемы, что и со string, если сделать StrNew в dll, а StrDispose в программе, или наоборот... Тогда уж WideString используйте, с ними таких проблем не бывает, правда, будут накладные расходы на преобразование ANSI<->UTF-16...

> А вот на этом по подробней можно.?

А мы по-другому давайте сделаем: вы почитаете справку про {$A}, а потом спросите, если что-то корнкретное там осталось непонятно, тогда и объясним...


 
de.   (2007-06-26 10:16) [6]


> Ega23 ©   (26.06.07 10:05) [4]

А я всегда явно указывал :PChar, и незаботился об освобождении.
Ну вот например верно будет?:
Программа:

...
type
TCnst = record
  MaxHeight, MaxWidth: Integer;
  MinHeight, MinWidth: Integer;
end;

tpHandBook = (thbAbonent, thbPlace, thbPoint, thbTpPoint, thbStreet, thbTpStreet);

THandBook = record
  Tp: tpHandBook;
  Left, Top: Integer;
  Height, Width: Integer;
  Cnst: TCnst;
  WinState: TWindowState;
  Caption: PChar;
end;
...
procedure CreateFormDLL(Application, Rec: THandBook);
...

procedure TfrmMain.ЧтотоClock(Sender: TObject);
var
 Rec: THandBook;
begin
 Rec.Tp := thbAbonent;
 Rec.Left := 0;
 Rec.Top := 0;
 Rec.Height := 400;
 Rec.Width := 800;
 Rec.Cnst.MaxHeight := 0;
 Rec.Cnst.MaxWidth := 0;
 Rec.Cnst.MinHeight := 400;
 Rec.Cnst.MinWidth := 800;
 Rec.WinState := wsMaximized;
 Rec.Caption := "Проверка PChar";

CreateFormDLL(Application, Rec: THandBook);
end;

dll- ка:

...
procedure CreateFormDLL(App:  TApplication; Rec: THandBook)
begin
...
Caption := Rec.Caption;
...
end;
...


 
Однокамушкин   (2007-06-26 10:29) [7]


> de.   (26.06.07 10:16) [6]
> Ну вот например верно будет?:

Конкретно так - да, будет верно, потому что вы Rec.Caption-у присваиваете литерал... Память для литералов выделяется компилятором, литералы жёстко прописываются в сегменте кода и существуют всё время работы программы и освобождать их не только не нужно, но и невозможно... после такого кода Rec.Caption просто будет указывать на ту память, в которую компилятор поместил литерал... А вот если вы присваиваете PChar-у не литерал, а какое-то другое значение, то будет утечка памяти...


 
P   (2007-06-26 14:03) [8]

Насколько я знаю для того чтобы очистить Pchar достаточно присвоить переменной пустое значение "", а все процедуры освобождения ресурсов сгенерирует компилятор.



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

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

Наверх




Память: 0.49 MB
Время: 0.023 c
2-1182570565
bagos
2007-06-23 07:49
2007.07.22
попиксельное изменение


15-1182797534
AlexKniga
2007-06-25 22:52
2007.07.22
Срочно нужен адрес публичного SMTP сервера


15-1182259369
Rponsh
2007-06-19 17:22
2007.07.22
Танчики(на Turbo pascal)


15-1182797515
Strate
2007-06-25 22:51
2007.07.22
Ищу драйвер на звуковуху


2-1182424026
Dib@zol
2007-06-21 15:07
2007.07.22
Чтение из середины