Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Так, а если общение через интерфейс, но интерфейс в DLL? [D7, WinXP]


Страницы:   1 2

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 через интерфейсы ничем не отличаются от случая "обычного" взаимодействия


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо