Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

экспорт из dll класса

6.8K
12 июля 2006 года
artemkaint
60 / / 12.07.2006
вообщем хочется засунуть большой блок программы не в модуль, а в dll, чтоб защитить его от вмешательства со стороны вышестояего прогера...
но столкнулся с проблемой невозможности экспорта класса...не объекта класса, не метода...а именно типа.....
подумал замутить через com-технологию, но описывать Интерфейс для огромного класса влом...
Как знаю для C можно экспортировать класс...а как это замутить в делфи???
6.8K
12 июля 2006 года
artemkaint
60 / / 12.07.2006
.Нашел пост на др форуме....мож кто разъяснит

Создать процедуры "обертки"
function CreateClass : TMyClass;
....
function myFunc(Class : TMyClass) : .....
begin
result := Class.myFunc;
end;
......
procedure DestroyClass(Class : TMyClass);
....
5
12 июля 2006 года
hardcase
4.5K / / 09.08.2005
DLL и вызывающий её EXE будут иметь РАЗНЫЕ пространства классов.
Никогда не получал сообщение типа:
Цитата:

Incompartible classes TIcon and TIcon


Это происходит из-за того, что их общий предок класс TObject есть как в EXE так и в самой DLL.

Так вот, для того, чтобы такого не происходило, нужно создавать пакеты (BPL). Код из них интегрируется в пространство классов вызывающего приложения.

А экзешник компилировать с использованием такого пакета.

339
13 июля 2006 года
verybadbug
619 / / 12.09.2005
а не проще просто отдать вышестоящему кодеру *.dcu ???
6.8K
13 июля 2006 года
artemkaint
60 / / 12.07.2006
просто если отдать dcu, то модуль будет сразу загружаться в приложение при начале выполнения....а там такая огромная прога, что если туда загрузить еще и мой модуль то она ваще свиснет..тем более мой кусок нужен не всегда....а если вызывать при необходимости аля dll эт нормально..

а вот bpl это интересно))))) надо попробовать))))
339
13 июля 2006 года
verybadbug
619 / / 12.09.2005
[QUOTE=artemkaint]просто если отдать dcu, то модуль будет сразу загружаться в приложение при начале выполнения....а там такая огромная прога, что если туда загрузить еще и мой модуль то она ваще свиснет..тем более мой кусок нужен не всегда....а если вызывать при необходимости аля dll эт нормально..

а вот bpl это интересно))))) надо попробовать))))[/QUOTE]
dcu тож присоединяется к exe-шнику на этапе компилирования.... и насколько я знаю, то, что в приложении использоваться не будет компилятор убирёт...
6.8K
13 июля 2006 года
artemkaint
60 / / 12.07.2006
так мне и не надо чтоб к экзешнику что-то прикрепилось.....надо чтоб это что-то вызвалось exe-шником при выполнении...а когда и не надо то не вызывалось....
339
14 июля 2006 года
verybadbug
619 / / 12.09.2005
[QUOTE=hardcase]...Так вот, для того, чтобы такого не происходило, нужно создавать пакеты (BPL). Код из них интегрируется в пространство классов вызывающего приложения.... экзешник компилировать с использованием такого пакета.[/QUOTE]
===========
6.8K
14 июля 2006 года
artemkaint
60 / / 12.07.2006
а вот терь объясните как мне заставить видеть новый клас, который я засунул в bpl....я сделал пакет с единственным модулем....модуль сделал как обычно...т.к. так вроде к умной книге было описано....вроде даже прикрепил пакет при компилировании, а он ругается на неиницилизацию класса....мож надо было пакет создавать как новый компанент???...или еще где обратиться к bpl-ке...??? Плз. хелп, а то горю на работе))))
10
14 июля 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=artemkaint]или еще где обратиться к bpl-ке...???[/QUOTE]
Смотря в виде чего ты создал плагин. Есть два способа:
  • Плагин в виде BPL (этот способ не пробовал):[LIST]
  • Целевой класс наследуется от TPersistent
  • Пакет грузится через LoadPackage
  • Класс ищется через FindClass
  • Плагин в виде DLL:
    • Базовый класс наследуется от TComponent или собственного класса, имеющего виртуальный конструктор
    • Все методы, реализуемые в плагине, объявляются как виртуальные
    • Целевой класс наследуется от базового
    • Объявляется метакласс вида type TMyPluginClass = class of TMyPlugin
    • DLL экспортирует функцию, возвращающую метакласс
    • Приложение вызывает функцию, получает метакласс и создает его через виртуальный конструктор
    [/LIST]Решение в виде DLL требует более вдумчивого проектирования, но сокращает число перекомпиляций при изменении кода.
  • 6.8K
    14 июля 2006 года
    artemkaint
    60 / / 12.07.2006
    хм...а примерчика на второй способ нету???
    10
    14 июля 2006 года
    Freeman
    3.2K / / 06.03.2004
    [QUOTE=artemkaint]хм...а примерчика на второй способ нету???[/QUOTE]
    В общем модуле:
     
    Код:
    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;


    В плагине:
    Код:
    type
      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;
    6.8K
    15 июля 2006 года
    artemkaint
    60 / / 12.07.2006
    спасибо попробую разобраться
    6.8K
    15 июля 2006 года
    artemkaint
    60 / / 12.07.2006
    [QUOTE=Freeman]В общем модуле:
     
    Код:
    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;


    [/QUOTE]

    так ...стоп...этож фактичести написание COM интерфейса...я прав или нет?
    10
    15 июля 2006 года
    Freeman
    3.2K / / 06.03.2004
    [QUOTE=artemkaint]так ...стоп...этож фактичести написание COM интерфейса...я прав или нет?[/QUOTE]
    Да, только без геморроя с регистрацией.

    В принципе, идея впервые была реализована Борландом. Ну, а потом Майкрософт реализовал ее по-майкрософтовски.

    Есть важное отличие - в чистом виде COM не допускает наследования реализации. BPL же от Борланд позволяют и это. А если писать на Дельфи, зачем платить больше?
    268
    07 октября 2006 года
    Михаил
    587 / / 25.06.2005
    можно ли использовать данную dll другими компиляторами? у них ведь другая объектная модель?
    10
    09 октября 2006 года
    Freeman
    3.2K / / 06.03.2004
    [QUOTE=Михаил]можно ли использовать данную dll другими компиляторами? у них ведь другая объектная модель?[/QUOTE]
    Только Дельфи-Билдер. Использование других компиляторов, извините меня, уже другая задача.
    39K
    07 мая 2008 года
    Harkonnen
    3 / / 07.05.2008
    с динамической загрузкой разобрались, а статическая ;).

    ооочень нужно, пожалуйста....

    Заранее благодарен, добросовестный форумчанин))).
    303
    07 мая 2008 года
    makbeth
    1.0K / / 25.11.2004
    Сформулируй вопрос поконкретнее ;)
    6
    07 мая 2008 года
    George
    4.1K / / 05.01.2007
    Короче аффторы читаем это - статья по работе с bpl-пакетами
    39K
    07 мая 2008 года
    Harkonnen
    3 / / 07.05.2008
    Формулирую фопрос по конкретнее:

    у меня имеется DLL из неё экспортирован вот такой класс:

     
    Код:
    type
       aaa: bool;
       bbb: int;
     private
       function ....;
     public
       function ....;
       procedure ....;
    end;


    как мне его загрузить и использовать не как плагин (динамическая загрузка описуется на этом форуме и на делфикингдом) а как обычную DLL (статически) например как импорт фукнций: function .....; external 'blablabla.dll';


    Цитата: Washington
    Короче аффторы читаем это - статья по работе с bpl-пакетами



    там точно такая же статья, создание плагина, а мне не плагин нужен.

    303
    07 мая 2008 года
    makbeth
    1.0K / / 25.11.2004
    Ну начнем с того, что класс у тебя не мог быть экспортирован из DLL, ибо Delphi этого не позволяет.
    Насчет собственно задачи - выше по теме есть пост Freeman'а, где выполняется динамическая загрузка DLL, получение адреса функции, и собственно, получение классовой ссылки с помощью данной функции. Так вот, для статической загрузки, достаточно импортировать функцию из DLL с помощью стандартного синтаксиса:
     
    Код:
    function GetPluginClass: TPluginClass; external 'Plugin1.dll';
    39K
    08 мая 2008 года
    Harkonnen
    3 / / 07.05.2008
    Извините я предыдущий немного не дописал забыл про myclass = class
    его уже экспортировал вот таким путём

    var
    exp_myclass: myclass

    Exports
    exp_myclass;
    303
    09 мая 2008 года
    makbeth
    1.0K / / 25.11.2004
    Не выйдет. Повторю, класс из DLL средствами Delphi экспортировать не возможно. Для этих целей используются пакеты.
    5
    09 мая 2008 года
    hardcase
    4.5K / / 09.08.2005
    Цитата: Harkonnen
    Извините я предыдущий немного не дописал забыл про myclass = class
    его уже экспортировал вот таким путём

    var
    exp_myclass: myclass

    Exports
    exp_myclass;


    Это ты переменную экспортировал а не класс...

    303
    10 мая 2008 года
    makbeth
    1.0K / / 25.11.2004
    Цитата: hardcase
    Это ты переменную экспортировал а не класс...


    Это он непонятно чего экспортировал ;) С каких это пор DLL позволяет экспортировать переменные? :rolleyes:

    51K
    29 июня 2009 года
    -Black_Hole-
    3 / / 29.06.2009
    Имеется библиотека, как экспортировать класс в Delphi?
    Напишите пожалуйста пример кода.
    6
    29 июня 2009 года
    George
    4.1K / / 05.01.2007
    написать
    [highlight=delphi]
    exports
    ClassName;
    [/highlight]?
    303
    29 июня 2009 года
    makbeth
    1.0K / / 25.11.2004
    -Black_Hole-, ты тему то всю прочитал?
    51K
    29 июня 2009 года
    -Black_Hole-
    3 / / 29.06.2009
    А можно по подробнее. Ета DLL написана на С++, исходники также имеются но в большом количестве, ето лиш одна библиотека из целой групы, а использовать надо лиш две и в Delphi. Также нет функций возвращаюших екземпляр класа.
    51K
    29 июня 2009 года
    -Black_Hole-
    3 / / 29.06.2009
    А что именно я пропустил?
    303
    29 июня 2009 года
    makbeth
    1.0K / / 25.11.2004
    Не люблю себя цитировать...
    Цитата: makbeth
    ...класс из DLL средствами Delphi экспортировать не возможно. Для этих целей используются пакеты.



    В C++ есть возможность экспорта классов (вернее оно так выглядит), но на самом деле DLL содержит только методы классов (что по сути есть обычная функция) и такой "экспорт" поддерживатеся компилятором.

    80K
    30 января 2012 года
    djdfy
    1 / / 30.01.2012
    Речь идет о принципиально новом виде бизнеса, который логичен и прост настолько,
    что, независимо от Ваших знаний или опыта.
    Было 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 рублей и совсем пустяковой работы! И главное это реально!
    Желаю всем удачи!
    Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
    Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог