Работа с обекти в DLL страница

Сайт на Delphi: ежедневни Delphi-новини, документация, статии, преглед, интервю, компютърен хумор.

Ако трябва да предадете указател към обект, създаден в хост приложението към DLL, или обратно, за да използвате обект, създаден в DLL в извикващото приложение, има проблем с несъвместимостта на обекта. Типичен пример за код, илюстриращ този проблем, е даден по-долу:

ако 0 е TButton тогава ShowMessage('Button') el se

Ако и двата метода са внедрени в извикващото приложение, тогава когато се щракне върху бутона във формуляра, ще се покаже съобщението „Бутон“. Ако методът WhatObject е имплементиран в DLL, тогава без значение какъв обект е посочен като параметър, винаги ще се появява съобщението "Не е ясно какво е". Така можем да направим абсолютно правилен извод, че не можете да създадете обект в един модул, а да го използвате в друг.

Защо работата с обекти в DLL е реализирана по този начин? Факт е, че приложението и DLL могат да бъдат реализирани на различни езици за програмиране. Съответно, дори при едни и същи имена на класове, броят на променливите в клас и/или техният размер и/или техният ред може да се различават. Същото важи и за методите на класа. Следователно в този случай операторът is винаги връща False, докато операторът as хвърля изключение.

DLL обаче може да използва обекти, създадени в извикващото приложение, и обратно. Това изисква както DLL, така и основното приложение да бъдат реализирани на един и същи език за програмиране. По-долу е даден пример за такъв код:

Методът ChangeColor е внедрен в DLL, докато методът ButtonlClick е внедрен в приложението. И DLL, и приложението са създадени в Delphi. Извикването на метода ChangeColor ще работи съвсем правилно, ако като параметърсочат към обект от тип i Form (или наследник на TForm). Въпреки това, DLL не може да провери типа на обект, преди да го прехвърли към TForm, така че ако използвате друг обект като параметър, той ще запише в непредсказуемо място в паметта и е добре, ако изключение бъде хвърлено веднага.

COM технологията предоставя алтернативен начин за решаване на този проблем, като позволява създаване на обекти в един модул и използване в друг. За тази цел се използват интерфейси. Примери за прилагане на интерфейси са дадени в глава 1.