Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > создание dll


Автор: Cashey 28.6.2006, 08:01
Только не смейтесь 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". На все матерится его мать....  

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

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

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

exports
  CreateRegistr,
  DestroyRegistr;
 

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

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

Автор: Guedda 28.6.2006, 08:47
Нет. Ты меня не понял. Вот так примерно получится?
Код

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.
  

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Автор: Cashey 29.6.2006, 09:01
Посмотрел в 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 на любом языке может использовать наш калькулятор! 
     

Автор: Yanis 29.6.2006, 09:46
Цитата(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 

Автор: ASGDeveloper 29.6.2006, 10:24
Может я вопроса не понял? Не знаю, я так понял.

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

то есть:
Код

...

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

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

exports CreateRegistry, DestroyRegistry;
 

Автор: Cashey 29.6.2006, 10:40
Yanis, да, но как такую библиотеку зарегистрировать???

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

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

Код

/////////
uses Registry

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

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

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

Автор: ASGDeveloper 29.6.2006, 11:25
Цитата(Cashey @  29.6.2006,  10:40 Найти цитируемый пост)
А можно ли создать DLL такого типа?

Можно, ИМХО лучше так:
заведи переменную типа TRegistry и:
Код

uses Registry;

var
  Reg : TRegistry;

procedure InitReg; stdcall; export;
begin
  Reg := Tregistry.create;
end;

procedure FreeReg; stdcall; export;
begin
  Reg.Free;
end;

procedure SetRoot (Root : Cardinal); stdcall; export;
begin
  Reg.Root:=Root;
end;

exports InitReg, FreeReg, SetRoot;



Аналогично дописываются остальные функции.  

Автор: Yanis 29.6.2006, 11:29
Цитата(Cashey @  29.6.2006,  11:40 Найти цитируемый пост)
Yanis, да, но как такую библиотеку зарегистрировать???

С помощью regsvr32, для COM сервера. Статью то читал на которую я ссылку дал?

Цитата(Cashey @  29.6.2006,  11:40 Найти цитируемый пост)
А можно ли создать DLL такого типа?

Как мне ненравится повторяться.... Guedda тебе именно такой пример и привёл. Или нет?

Цитата(ASGDeveloper @  29.6.2006,  12:25 Найти цитируемый пост)
Можно, но ИМХО лучше так:
заведи переменную типа TRegistry и:

Хватит писать одно и тоже smile 

Автор: Cashey 29.6.2006, 11:53
Цитата(Yanis @  29.6.2006,  12:29 Найти цитируемый пост)
Статью то читал на которую я ссылку дал?

нет, не читал. адрес почему-то занесен админами в блок-лист.

Цитата(Yanis @  29.6.2006,  12:29 Найти цитируемый пост)
С помощью regsvr32, для COM сервера.

я создал DLL с, приведенным мною, кодом из DRKB (один в один). Но regsvr32 ее регистрировать отказывается - нет точки входа. 

Автор: Romikgy 29.6.2006, 11:59
Cashey,  smile 
Цитата(_hunter @  29.6.2006,  10:05 Найти цитируемый пост)
regsvr32 регистрирует ТОЛЬКО COM-сервера.
простая библиотека с классом -- НЕ COM-сервер.

ответ на 
Цитата(Cashey @  29.6.2006,  10:53 Найти цитируемый пост)
я создал DLL с, приведенным мною, кодом из DRKB (один в один). Но regsvr32 ее регистрировать отказывается - нет точки входа.  

На читай smile 

Автор: _hunter 29.6.2006, 12:00
этот код не является COM-сервером 

Автор: Yanis 29.6.2006, 13:14
Romikgy
Я уже давал ссылку на эту статью. 

Автор: Rrader 29.6.2006, 13:38
File - New - Other - ActiveX - ActiveX

Пример в аттаче
 

Автор: Cashey 29.6.2006, 14:58
Цитата(Romikgy @  29.6.2006,  12:59 Найти цитируемый пост)
На читай smile

Да, это то что надо smile
Всем спасибо smile 

Автор: Yanis 29.6.2006, 15:16
Цитата(Cashey @  29.6.2006,  15:58 Найти цитируемый пост)
Да, это то что надо 
Всем спасибо   

Ты похоже мою ссылку тоже не смотрел. smile 

Автор: Romikgy 29.6.2006, 16:53
Цитата(Yanis @  29.6.2006,  12:14 Найти цитируемый пост)
Я уже давал ссылку на эту статью.  

Где ссылка то это архив
Цитата(Yanis @  29.6.2006,  14:16 Найти цитируемый пост)
Ты похоже мою ссылку тоже не смотрел.


Цитата(Cashey @  29.6.2006,  10:53 Найти цитируемый пост)
нет, не читал. адрес почему-то занесен админами в блок-лист.


Yanis, еще вопросы есть? это и есть твоя ссылка только в архиве 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)