![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Так, а если общение через интерфейс, но интерфейс в DLL? [D7, WinXP]
Mx © (2005-08-05 12:20:00)Нужен ли тогда ShareMem? Допустим загружаем DLL, а она экспортирует функцию для создания объекта, с которым потом общаемся через интерфейс (объект не COM, но интерфейс реализует, как IDesigner в Delphi). Будут ли проблемы со string'ами (не бельем, естественно)?
Alexander Panov (2005-08-05 15:50:00) [21]Mx © (05.08.05 15:37) [10]
Так вот, созданный объект App не разрушается,
А в какой момент он должен быть у тебя разрушен?
GLFox (2005-08-05 15:46:00) [22]А непосредственно сделать так:
App := nil
не пробовал?
Mx (2005-08-05 15:39:00) [23]Ну почему нельзя редактировать своё сообщения? Порой такие несуразные ошибки!
С типами я в примере напутал. Результат у CreateAppObject естественно IApplicationInterface.
Mx (2005-08-05 15:37:00) [24]Есть консольное приложение:
program CnConsole;
{$APPTYPE CONSOLE}
type
TConsoleClient = class(TInterfacedObject, IClientInterface)
end;
function CreateAppObject: IApplicationInterface; external 'SomeLib.dll';
var
Client: IClientInterface;
App: IApplicationInterface;
begin
App := CreateAppObject;
try
Client := TConsoleClient.Create;
App.Connect(...);
except
on E: Exception do
WriteLn(...);
end;
WriteLn('Press ENTER to continue...');
ReadLn;
end.
В этой самой SomeLib.dll имеем класс:
type
TConceptApplication = class(TInterfacedObject, IApplicationInterface)
private
...
end;
var
ConceptApplication: TConceptApplication;
implementation
...
end.
и экспортируемая фукнция:
function CreateAppObject: IConceptApplication;
begin
Result := TConceptApplication.Create;
end;
Так вот, созданный объект App не разрушается, а вроде как счетчик ссылок при выходе должен был сам на нуль свалить. Почему так?
GLFox (2005-08-05 15:16:00) [25]А лучше всего использовать PChar, чтобы не тащить ShareMem с собой.
Mx (2005-08-05 14:22:00) [26]
> Digitman © (05.08.05 13:39) [7]
> разные экз-ры менеджеров памяти
Вот оказывается в чем проблема? Гм... тогда сделаю пакеты, тем более потом еще и в Kilyx'е будут использовать.
Digitman (2005-08-05 13:39:00) [27]
> Mx © (05.08.05 13:03) [2]
используешь ты интерфейсы или не используешь - без разницы, правила использования ShareMem едины и касаются динам.типов данных, передаваемых как параметры dll-вызовов и получаемых как результаты этих вызовов
разницы нет никакой - то ли ты вызвал из ДЛЛ непосредственно ф-цию SomeFunction(), то ли ты вызвал некий метод некоего интерфейса SomeInterface.SomeMethod()
ShareMem необходим всегда в случаях когда вызывающий и вызываемый код используют разные экз-ры менеджеров памяти, но при этом есть оправданная необходимость выделения памяти в одном коде, а перераспределения/освобождения - в другом
ShareMem, будучи подключенным, будет использован как единый менеджер памяти для обоих кодов
Sharemem необходим в случаях , когда взаимодействующие модули (передающие между собой, например, данные дин.типов) разрабатываются в среде Делфи/BCB и при сборке этих модулей использованы разные зн-я опции Build With Run-Time Packages
Sharemem не требует своего использования, если все взаимодействующие модули были собраны с опцией Build With Run-Time Packages = True, при этом они будут использовать единый менеджер памяти, который находится в ран-тайм-библиотеке, загружаемой в АП процесса единожды и используемой впоследствии всеми модулями.
DiamondShark (2005-08-05 13:16:00) [28]А в чём расстройство-то?
Если интерфейсы используются только как фича языка, то действуют все те же правила, что и для любых других конструкций.
Mx (2005-08-05 13:11:00) [29]Ну вот, расстроили меня... :(
Alexander Panov (2005-08-05 13:09:00) [30]Mx © (05.08.05 13:03) [2]
для интерфейсов правила, которые описаны в Wizard-dll - те же самые.
wal (2005-08-05 13:08:00) [31]Если через интерфейс будешь строки (string) или дин. массивы передавать, то нужен, если нет, то не нужен, А почему бы сразу на COM не замахнуться, а не только на интерфейсы?
С уважением.
Mx (2005-08-05 13:03:00) [32]
> Digitman © (05.08.05 12:47) [1]
Торможу, так нужен ShareMem или нет? Если можно, по-подробнее.
Digitman (2005-08-05 12:47:00) [33]смысл, необходимость и логика использования Sharemem в случае взаимодействия с dll через интерфейсы ничем не отличаются от случая "обычного" взаимодействия