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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
2-1182477171
wesel
2007-06-22 05:52
2007.07.22
MDI приложения, переход по открытым окнам как по TASKBAR


15-1182495639
Serg 1968
2007-06-22 11:00
2007.07.22
Хочется понять


9-1156784627
Начинающий_1
2006-08-28 21:03
2007.07.22
OpenGL. Помогите оптимизировать код.


15-1182408203
homm
2007-06-21 10:43
2007.07.22
Mac OC X на VMWare


15-1182833764
pavel_guzhanov
2007-06-26 08:56
2007.07.22
Есть тут спецы по php и iis?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский