Форум: "Прочее";
Текущий архив: 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.47 MB
Время: 0.032 c