Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание dll, экспорт из dll объкекта 
V
    Опции темы
Cashey
  Дата 28.6.2006, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Только не смейтесь smile Вопрос безусловно ламерский smile Но ответ нужен.
Короче, хочу создать dll для юзания из программ на других языках.
Код

library Reg;

{$R-,T-,H+,X+}

uses Windows, Classes, SysUtils, IniFiles, Dialogs, RTLConsts;

{$R *.res}
type
  TRegistr = class(TObject)
  private
    FLazyWrite: Boolean;
    FAccess: LongWord;

  protected
    procedure ChangeKey(Value: HKey; const Path: string);
  public
    constructor Create; overload;
    destructor Destroy; override;
    procedure CloseKey;  stdcall;
    function CreateKey(const Key: string): Boolean;  stdcall;
    function DeleteKey(const Key: string): Boolean;
   end;

constructor TRegistr.Create;
begin
  FAccess := KEY_ALL_ACCESS;
  ShowMessage('create') ;
end;

destructor TRegistr.Destroy;
begin
  CloseKey;
  inherited;
end;

procedure TRegistr.ChangeKey(Value: HKey; const Path: string);
begin
  CloseKey;
end;

procedure TRegistr.CloseKey;
begin
ShowMessage('aaa');
end;

function TRegistr.CreateKey(const Key: string): Boolean; //stdcall;
begin
 ShowMessage('bbb');
end;

function TRegistr.DeleteKey(const Key: string): Boolean;
begin
ShowMessage('ccc');
end;

exports {Вот тут что писать????} ;

begin

end.


Так вот этот код не компилится. Ругается на предложение exports. Я пытался писать "exports ChangeKey", "exports TRegistr.ChangeKey", "exports TRegistr". На все матерится его мать....  


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Guedda
Дата 28.6.2006, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Классы из ДЛЛ невозможно экспортировать, поэтому тебе прийдётся дописать к коду библы ещё на каждое событие по процедуре:
Код

procedure CreateRegistr;
begin
  TRegistr.Create; //Что то типа того
end;

А в exports написать:
Код

exports
  CreateRegistr,
  DestroyRegistr;
 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Cashey
Дата 28.6.2006, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Цитата(Guedda @  28.6.2006,  09:21 Найти цитируемый пост)
Классы из ДЛЛ невозможно экспортировать, поэтому тебе прийдётся дописать к коду библы ещё на каждое событие по процедуре:

отдельную DLL на каждый метод?! Бред какой-то! 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Guedda
Дата 28.6.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Нет. Ты меня не понял. Вот так примерно получится?
Код

library Reg;
{$R-,T-,H+,X+}
uses Windows, Classes, SysUtils, IniFiles, Dialogs, RTLConsts;
{$R *.res}
type
  TRegistr = class(TObject)
  private
    FLazyWrite: Boolean;
    FAccess: LongWord;
  protected
    procedure ChangeKey(Value: HKey; const Path: string);
  public
    constructor Create; overload;
    destructor Destroy; override;
    procedure CloseKey;  stdcall;
    function CreateKey(const Key: string): Boolean;  stdcall;
    function DeleteKey(const Key: string): Boolean;
   end;
constructor TRegistr.Create;
begin
  FAccess := KEY_ALL_ACCESS;
  ShowMessage('create') ;
end;

destructor TRegistr.Destroy;
begin
  CloseKey;
  inherited;
end;
procedure TRegistr.ChangeKey(Value: HKey; const Path: string);
begin
  CloseKey;
end;
procedure TRegistr.CloseKey;
begin
ShowMessage('aaa');
end;
function TRegistr.CreateKey(const Key: string): Boolean; //stdcall;
begin
 ShowMessage('bbb');
end;
function TRegistr.DeleteKey(const Key: string): Boolean;
begin
ShowMessage('ccc');
end;

{Что то в этом роде}

procedure CreateRegistr;
begin
  Registr := TRegistr.Create;
  Registr.CreateKey('Example');
end;

procedure DeleteRegistr;
begin
  Registr.DeleteKey;
end;

exports
  CreateRegistr, DeleteRegistr;

begin
end.
  


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Cashey
Дата 28.6.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Guedda, скомпилится он так скомпилился, только regsvr32 его отказывается регистрить - пишет нет точки входа 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Guedda
Дата 28.6.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Скажи, а зачем тебе класс в dll вписывать? Гораздо проще и рациональней использовать bpl, и подключать её, когда надо... 


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Yanis
Дата 28.6.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Cashey @  28.6.2006,  15:17 Найти цитируемый пост)
Guedda, скомпилится он так скомпилился, только regsvr32 его отказывается регистрить - пишет нет точки входа  

А с чего бы это её регистрировать какую то левую длл-ку, да которая ещё и не является COM сервером?

Добавлено @ 15:40 
Немогу найти эту статью в метсном факе, потому что он очень неудобный. Но про создание COM есть в drkb. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Cashey
Дата 29.6.2006, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Цитата(Yanis @  28.6.2006,  16:36 Найти цитируемый пост)

А с чего бы это её регистрировать какую то левую длл-ку, да которая ещё и не является COM сервером?

Ну чего сразу левая? smile самая обычная простенькая тестовая DLL'ка. Я на фоксе полным полно подобных наделал. Тем более, мне не обязательно COM, вполне достаточно будет OLE объект из нее получить. 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Yanis
Дата 29.6.2006, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Cashey @  29.6.2006,  08:51 Найти цитируемый пост)
Ну чего сразу левая?

Для regsvr32 она левая smile  


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Cashey
Дата 29.6.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Ну можно простейший пример с "Hello word" для нелевой библиотеки, но что бы регистрировалась в regsvr32. К сожалению закачать DRKB сейчас возможности не имею  smile

Добавлено @ 08:19 
Цитата(Guedda @  28.6.2006,  16:24 Найти цитируемый пост)
Скажи, а зачем тебе класс в dll вписывать? Гораздо проще и рациональней использовать bpl, и подключать её, когда надо...  

читай первый пост:

Цитата(Cashey @  28.6.2006,  09:01 Найти цитируемый пост)
Короче, хочу создать dll для юзания из программ на других языках.


Но на самом деле все проще. В Дельфях есть модуль Registry. В нем много вкусного, что может облегчить работу на ФоксПро. Вот я и хочу сделать содержимое этого модуля доступным для программ, написанных не на Дельфи 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Cashey
Дата 29.6.2006, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Посмотрел в DRKB. Вот такой пример там нашел. Он замечательно демонстрирует как создать DLL с классом, но увы..... эта DLL так же не регистрится regsvr32
Код

library CalcDll; 

uses SysUtils, Classes; 

type 
 MyCalc=class  

 fx,fy:integer;  
 
public 
 procedure SetOperands(x,y:integer);  
 function Sum:integer;  
 function Diff:integer;  
end; 

var Calc:MyCalc; 

procedure MyCalc.SetOperands(x,y:integer); 
begin 
 fx:=x; fy:=y;  
end; 

function MyCalc.Sum:integer; 
begin 
 result:=fx+fy;  
end; 

function MyCalc.Diff:integer; 
begin 
 result:=fx-fy;  
end; 

procedure SetOperands(x,y:integer); 
begin 
 Calc.SetOperands(x,y);  
end; 

function Sum:integer; 
begin 
 result:=Calc.Sum;  
end; 

function Diff:integer; 
begin 
 result:=Calc.Diff;  
end; 

procedure CreateObject; 
begin 
 Calc:=MyCalc.Create;  
end; 

procedure ReleaseObject; 
begin 
 Calc.Free;  
end; 

exports //Вот эта секция и указывает компилятору что записать в таблицу экспорта 
 SetOperands,  
 Sum,  
 Diff,  
 CreateObject,  
 ReleaseObject;  

begin 
end. 


Хотя в топике и написано:
Цитата

Классно! Теперь каждый программирующий в системе Windows на любом языке может использовать наш калькулятор! 
     

Это сообщение отредактировал(а) Cashey - 29.6.2006, 09:05


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Yanis
Дата 29.6.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Cashey @  29.6.2006,  10:01 Найти цитируемый пост)
Посмотрел в DRKB. Вот такой пример там нашел. 

Именно этот способ тебе описал Guedda.

Добавлено @ 09:46 
Цитата(Yanis @  28.6.2006,  16:36 Найти цитируемый пост)
Немогу найти эту статью в метсном факе, потому что он очень неудобный. Но про создание COM есть в drkb. 

http://yanis.front.ru/files/tmp/COM_creating.mht 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
ASGDeveloper
Дата 29.6.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Может я вопроса не понял? Не знаю, я так понял.

Модуль Registry имеет очень много полезных процедур и функций, так?
И хочется, чтобы приложения написанные НЕ на дельфе, получили тот же функционал? Было принято решение создать дллку в которую прописать все полезные функции указанного выше модуля? Если все так, то ИМХО ответ один: писать безклассовую дллку, с одними только процедурами и добавлять к описанию каждой stdcall; export; 

то есть:
Код

...

procedure CreateRegistry; stdcall; export;
begin
//делаем что-то полезное
end;

procedure DestroyRegistry; stdcall; export;
begin
//делаем что-то полезное
end;

exports CreateRegistry, DestroyRegistry;
 
PM MAIL   Вверх
Cashey
Дата 29.6.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Yanis, да, но как такую библиотеку зарегистрировать???

ASGDeveloper, переписывать весь модуль довольно трудоемко. Учитывая, что в нем используются (или могут использоватся) перекрестные ссылки 

А можно ли создать DLL такого типа?

Код

/////////
uses Registry

procedure DestroyRegistry; stdcall; export;
begin
//вызов TRegistry.DestroyRegistry из модуля Registry
end;
 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
_hunter
Дата 29.6.2006, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



попробую я объяснить...
regsvr32 регистрирует ТОЛЬКО COM-сервера.
простая библиотека с классом -- НЕ COM-сервер.

P.S.
никто не мешает иметь в одном сервере несколько модулей 


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.