type
TPlugin = class;
TPluginClass = class of TPlugin;
TPluginFunc = function: TPluginClass;
TPlugin = class(TForm) // или TFrame, или TComponent
public
procedure Action1; dynamic; abstract;
function Status1: Integer; dynamic; abstract;
end;
экспорт из dll класса
но столкнулся с проблемой невозможности экспорта класса...не объекта класса, не метода...а именно типа.....
подумал замутить через com-технологию, но описывать Интерфейс для огромного класса влом...
Как знаю для C можно экспортировать класс...а как это замутить в делфи???
Создать процедуры "обертки"
function CreateClass : TMyClass;
....
function myFunc(Class : TMyClass) : .....
begin
result := Class.myFunc;
end;
......
procedure DestroyClass(Class : TMyClass);
....
Никогда не получал сообщение типа:
Цитата:
Incompartible classes TIcon and TIcon
Это происходит из-за того, что их общий предок класс TObject есть как в EXE так и в самой DLL.
Так вот, для того, чтобы такого не происходило, нужно создавать пакеты (BPL). Код из них интегрируется в пространство классов вызывающего приложения.
А экзешник компилировать с использованием такого пакета.
а не проще просто отдать вышестоящему кодеру *.dcu ???
а вот bpl это интересно))))) надо попробовать))))
а вот bpl это интересно))))) надо попробовать))))[/QUOTE]
dcu тож присоединяется к exe-шнику на этапе компилирования.... и насколько я знаю, то, что в приложении использоваться не будет компилятор убирёт...
так мне и не надо чтоб к экзешнику что-то прикрепилось.....надо чтоб это что-то вызвалось exe-шником при выполнении...а когда и не надо то не вызывалось....
===========
а вот терь объясните как мне заставить видеть новый клас, который я засунул в bpl....я сделал пакет с единственным модулем....модуль сделал как обычно...т.к. так вроде к умной книге было описано....вроде даже прикрепил пакет при компилировании, а он ругается на неиницилизацию класса....мож надо было пакет создавать как новый компанент???...или еще где обратиться к bpl-ке...??? Плз. хелп, а то горю на работе))))
Смотря в виде чего ты создал плагин. Есть два способа:
- Плагин в виде BPL (этот способ не пробовал):[LIST]
- Целевой класс наследуется от TPersistent
- Пакет грузится через LoadPackage
- Класс ищется через FindClass
- Базовый класс наследуется от TComponent или собственного класса, имеющего виртуальный конструктор
- Все методы, реализуемые в плагине, объявляются как виртуальные
- Целевой класс наследуется от базового
- Объявляется метакласс вида type TMyPluginClass = class of TMyPlugin
- DLL экспортирует функцию, возвращающую метакласс
- Приложение вызывает функцию, получает метакласс и создает его через виртуальный конструктор
хм...а примерчика на второй способ нету???
В общем модуле:
Код:
В плагине:
Код:
type
TPlugin1 = class(TPlugin)
public
procedure Action1; override;
function Status1: Integer; override;
end;
function GetPluginClass: TPluginClass;
begin
Result := TPlugin1;
end;
exports
GetPluginClass;
TPlugin1 = class(TPlugin)
public
procedure Action1; override;
function Status1: Integer; override;
end;
function GetPluginClass: TPluginClass;
begin
Result := TPlugin1;
end;
exports
GetPluginClass;
В вызывающей программе:
Код:
var
hLib: THandle;
Func: TPluginFunc;
begin
hLib := LoadLibrary('Plugin1.dll');
if hLib <> 0 then
begin
Func := TPluginFunc(GetProcAddress(hLib, 'GetPluginClass'));
if Assigned(Func) then
begin
Plugin := Func.Create(nil); // срабатывает виртуальный конструктор
Plugin.Action1;
if Plugin.Status1 <> 0 then
Plugin.Action1;
// и т. д.
end
else
// не найдена функция
end
else
// библиотека не найдена
end;
hLib: THandle;
Func: TPluginFunc;
begin
hLib := LoadLibrary('Plugin1.dll');
if hLib <> 0 then
begin
Func := TPluginFunc(GetProcAddress(hLib, 'GetPluginClass'));
if Assigned(Func) then
begin
Plugin := Func.Create(nil); // срабатывает виртуальный конструктор
Plugin.Action1;
if Plugin.Status1 <> 0 then
Plugin.Action1;
// и т. д.
end
else
// не найдена функция
end
else
// библиотека не найдена
end;
спасибо попробую разобраться
Код:
type
TPlugin = class;
TPluginClass = class of TPlugin;
TPluginFunc = function: TPluginClass;
TPlugin = class(TForm) // или TFrame, или TComponent
public
procedure Action1; dynamic; abstract;
function Status1: Integer; dynamic; abstract;
end;
TPlugin = class;
TPluginClass = class of TPlugin;
TPluginFunc = function: TPluginClass;
TPlugin = class(TForm) // или TFrame, или TComponent
public
procedure Action1; dynamic; abstract;
function Status1: Integer; dynamic; abstract;
end;
[/QUOTE]
так ...стоп...этож фактичести написание COM интерфейса...я прав или нет?
Да, только без геморроя с регистрацией.
В принципе, идея впервые была реализована Борландом. Ну, а потом Майкрософт реализовал ее по-майкрософтовски.
Есть важное отличие - в чистом виде COM не допускает наследования реализации. BPL же от Борланд позволяют и это. А если писать на Дельфи, зачем платить больше?
можно ли использовать данную dll другими компиляторами? у них ведь другая объектная модель?
Только Дельфи-Билдер. Использование других компиляторов, извините меня, уже другая задача.
ооочень нужно, пожалуйста....
Заранее благодарен, добросовестный форумчанин))).
Сформулируй вопрос поконкретнее ;)
это - статья по работе с bpl-пакетами
Короче аффторы читаем
у меня имеется DLL из неё экспортирован вот такой класс:
Код:
type
aaa: bool;
bbb: int;
private
function ....;
public
function ....;
procedure ....;
end;
aaa: bool;
bbb: int;
private
function ....;
public
function ....;
procedure ....;
end;
как мне его загрузить и использовать не как плагин (динамическая загрузка описуется на этом форуме и на делфикингдом) а как обычную DLL (статически) например как импорт фукнций: function .....; external 'blablabla.dll';
Цитата: Washington
Короче аффторы читаем это - статья по работе с bpl-пакетами
там точно такая же статья, создание плагина, а мне не плагин нужен.
Насчет собственно задачи - выше по теме есть пост Freeman'а, где выполняется динамическая загрузка DLL, получение адреса функции, и собственно, получение классовой ссылки с помощью данной функции. Так вот, для статической загрузки, достаточно импортировать функцию из DLL с помощью стандартного синтаксиса:
Код:
function GetPluginClass: TPluginClass; external 'Plugin1.dll';
его уже экспортировал вот таким путём
var
exp_myclass: myclass
Exports
exp_myclass;
Не выйдет. Повторю, класс из DLL средствами Delphi экспортировать не возможно. Для этих целей используются пакеты.
Цитата: Harkonnen
Извините я предыдущий немного не дописал забыл про myclass = class
его уже экспортировал вот таким путём
var
exp_myclass: myclass
Exports
exp_myclass;
его уже экспортировал вот таким путём
var
exp_myclass: myclass
Exports
exp_myclass;
Это ты переменную экспортировал а не класс...
Цитата: hardcase
Это ты переменную экспортировал а не класс...
Это он непонятно чего экспортировал ;) С каких это пор DLL позволяет экспортировать переменные? :rolleyes:
Напишите пожалуйста пример кода.
[highlight=delphi]
exports
ClassName;
[/highlight]?
-Black_Hole-, ты тему то всю прочитал?
А можно по подробнее. Ета DLL написана на С++, исходники также имеются но в большом количестве, ето лиш одна библиотека из целой групы, а использовать надо лиш две и в Delphi. Также нет функций возвращаюших екземпляр класа.
А что именно я пропустил?
Цитата: makbeth
...класс из DLL средствами Delphi экспортировать не возможно. Для этих целей используются пакеты.
В C++ есть возможность экспорта классов (вернее оно так выглядит), но на самом деле DLL содержит только методы классов (что по сути есть обычная функция) и такой "экспорт" поддерживатеся компилятором.
что, независимо от Ваших знаний или опыта.
Было 70 рублей, а стало 700.000 рублей. Я наткнулась на это на одном
форуме совершенно случайно и решила попробовать. Бродя, как обычно, по
разного рода форумам я нахожу эту статью, в которой говорится, что МОЖНО
СДЕЛАТЬ ТЫСЯЧИ ДОЛЛАРОВ ЗА ПАРУ НЕДЕЛЬ ПРИ ВЛОЖЕНИИ ВСЕГО 70 рублей
(прим. от "автора": таких бабок за ДВЕ НЕДЕЛИ вы явно не увидите.
Гораздо позже). Там говорилось, что надо послать по 10руб. на 7 Internet
кошельков, которые ниже перечислены. Потом Вы вписываете номер своего
Internet кошелька и закидываете данное, с Вами на седьмой строчке,
сообщение на 200 разных форумов, доски объявлений и многочисленные сайты
по поиску работы. Никаких уловок - Ну я поразмышлял и
подумал, что я в принципе ничего не теряю кроме 70 рублей - и решила
попробовать. Установила Интернет кошелёк, перечислила всем участникам
акции по 10 руб. и начала рассылать эти объявления по разным форумам. В
течение 2-х дней я зарегистрировалась на 120 бизнес форумах и бесплатных
досках объявлений. Прошла неделя, заглядываю в свой Интернет кошелек -
поступлений никаких нет. А разные участники пишут, что за неделю
заработали кто по 25$, кто по 15$. Ну и бросила это занятие, так и не
дослав свое объявление до 200 форумов. Ещё через две недели, случайно в
Интернете нашла комментарий к этому проекту (комментарий убедительный).
Открыла свой Интернет кошелек, а в нем уже около 900 рублей. Непонятная
картина, но всё равно за 1 месяц 900 рублей это очень мало. И вдруг
после 1 месяца началось самое интересное: на мой кошелёк стали приходить
деньги каждый день, спустя ещё 2 недели на моем счету уже было более 30
тыс. руб. После этого я отправила свои объявления ещё на 120 форумов.
Результат был ошеломляющий. По прошествии всего 2 месяцев, я получила 4
700$ и деньги идут каждый день. Каждые 6 минут на мой счёт поступает по
10 рублей. И это все только за цену в 70 руб.!!!Я не поверила, что это
работает, пока не начала получать переводы со всего света.
Теперь немного посчитаем что будет если в месяц привлечь 5 человек
итак 1 месяц вы привлекли 5 чел.= 50руб
2 месяц каждый чел. из 1ого месяца 5чел. 5*5=25чел.=250руб.
3 месяц каждый чел. из 2ого месяца 5чел. 25*5=125чел.=1250руб.
4 месяц каждый чел. из 3ого месяца 5чел. 125*5=625чел.=6250руб.
5 месяц каждый чел. из 4ого месяца 5чел. 625*5=3125чел.=31250руб.
6 месяц каждый чел. из 5ого месяца 5чел. 3125*5=15625чел.=156250руб
итог: за 6 месяцев работы заработок=195000руб. При вложении 70руб.
И это если привлечь всего 5 человек за месяц, а если привлекать больше,
да еще и каждый месяц а не только первый, то ваша прибыль увеличиться в разы.
Моя работа
теперь - это каждый день по 2 часа в Интернете и ВСЁ! А заработок такой,
что никаким начальникам и руководителям даже и не снился. Теперь я
расскажу Вам, как это работает, и самое главное ПОЧЕМУ! Я вам обещаю,
что если вы будете в точности соблюдать ниже перечисленные инструкции,
то вы начнете получать намного больше денег, чем вы думали, не прилагая
к этому особых усилий. Согласитесь, это просто!!! И ваш вклад составляет
всего 70 рублей... ВАЖНО: ЭТО НЕ ОБМАН!!! ЭТО НЕ "РАЗВОД" !!!И ПРИ ЭТОМ
ВЫ НИЧЕМ НЕ РИСКУЕТЕ, НО ЭТО РАБОТАЕТ!!! ВНИМАНИЕ!!! ПРОЧТИТЕ ЭТО ПАРУ
РАЗ!!! Всё это удачно работает благодаря ЧЕСТНОСТИ участников. ВОТ ТЕ
САМЫЕ ТРИ ШАГА К УСПЕХУ:
1.Зарегистрируйтесь с системе YANDEX MONEY,
хорошенько
ознакомьтесь с данной системой как она работает. Можно просто
зарегистрировать почтовый ящик на Яндексе, и войдя на почту можно
создать кошелек. Установите Интернет. Кошелек, затем выберите
оптимальный для себя вариант пополнения кошелька и внесите 80(почему восемьдесят?
Потому что за транзакции берут процент) руб. на
свой кошелек (карточки Yandex * ДЕНЬГИ минимум 100 руб. продаются в
обычных ларьках или прочитайте на страничке другие способы пополнения
кошелька).
2. Возьмите первый номер кошелька из нижеуказанного списка,
отправьте на него 10 руб., вписав этот номер в поле "Номер счёта", (в
поля "Имя получателя" и "E-mail получателя" вписывать ничего не нужно),
в поле Контракт/назначение платежа: напишите - "Пожалуйста, внесите меня
в список Yandex кошельков". Все, что Вы сделали - это создали услугу, и
самое главное - абсолютно легально. Вы просите законный сервис, за
который платите. Далее, начиная со второго, по аналогии отправьте по 10
руб. на следующие 6 кошельков (не забудьте вписывать в поле
Контракт/назначение платежа: "Пожалуйста, внесите меня в список Yandex
кошельков")
1.) 410011284039595 ;
2.) 410011284044790 ;
3.) 410011262919231 ;
4.) 410011284051612 ;
5.) 410011284054598 ;
6.) 410011284056225 ,
7.) 410011259975029 ;
Теперь ВНИМАНИЕ!!! После того, как Вы выполнили ШАГ
2, скопируйте к себе на компьютер весь этот текст от начала до конца
(можно в формате txt или ещё как вам удобней). В скопированной статье
вычеркните из этого списка 1-ый кошелёк и переместите 2-ой кошелёк на
место 1-го, который Вы
стёрли, тем самым переместите список на одну строку выше (7 становится
6, 6 становится 5 –и т.д..), и впишите в 7-ую строчку Ваш кошелёк.
3.Желательно не делать в этой статье какие либо изменения, так как этот
текст наиболее понятно излагает смысл. Разместите эту статью на не менее
чем 200 форумах и новостных лентах (News Groups) или рассылайте по
почте, сайтах по поиску работы ( объявления разместить надо в каждом городе отдельно)
и досках объявлений. Запомните, чем больше
вы разместите, тем выше будет ваш доход, и
этот доход будет напрямую зависеть от вас. Размещение этой статьи на 200
форумах, даже на самых малопосещаемых, гарантирует Вам доход. Больше
размещений - больше доход при том в геометрической прогрессии. ПОМНИТЕ
ЭТО!!! Этот бизнес продолжает существовать и процветать только БЛАГОДАРЯ
ЧЕСТНОСТИ И СЕРЬЕЗНОСТИ УЧАСТНИКОВ. Итак, когда вы достигнете первой
позиции, вы будете иметь тысячи долларов просто как создатель списка!
Это стоит 70 рублей и совсем пустяковой работы! И главное это реально!
Желаю всем удачи!