Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с dll [D7, Win2k]


r9000 ©   (2004-09-27 08:10:00) 

Добрый день!

Пытаюсь создать простую dll. Делаю так(это для примера):
library udf1_dll;
uses
 SysUtils,
 Classes;

{$R *.res}

function DatPreob(var InDate: integer): String; stdcall;
begin
Result:=inttostr(InDate);

end;
exports  DatPreob;

begin
end.

Подключаю ее и пытаюсь использовать:
unit Unit4;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   DateTimePicker1: TDateTimePicker;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
function DatPreob(var InDate: integer): String; stdcall; external 'udf1_dll.dll';

procedure TForm1.Button1Click(Sender: TObject);

begin
Edit1.Text:= DatPreob(45);
end;

end.

Выдает ошибку. Что я неправильно сделал?


Vlad   (2004-09-27 10:15:00) [1]

автору:
когда перепишешь ф-цию с PChar вместо string (а я боюсь, ты неизбежно к этому придешь) - не забудь убить ShareMem из USES :-)


r9000   (2004-09-27 10:14:00) [2]

Да большое спасибо, получилось!


Cobalt   (2004-09-27 10:11:00) [3]

2 r9000  
Ну блин!!!
Почитай же документацию к БД!!!

P.S. У меня вот в книжке по БД есть пример - там используется PChar - на вход и выход.


Skyle   (2004-09-27 10:07:00) [4]


> unit Unit4;
>
> interface
>
> uses
>  ShareMem,

uses ShareMem в файл ПРОЕКТА, а не формы


r9000   (2004-09-27 10:00:00) [5]

library udf1_dll;
uses
 ShareMem,SysUtils,
 Classes;

{$R *.res}

function DatPreob(InDate: integer): String; stdcall;
begin
InDate:=InDate+100;
Result:=inttostr(InDate);

end;
exports  DatPreob;

begin
end.
////////////Вызов функции
unit Unit4;

interface

uses
 ShareMem,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   DateTimePicker1: TDateTimePicker;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
// uses ShareMem;
{$R *.dfm}
function DatPreob(InDate: integer): String; stdcall; External 'udf1_dll.dll';

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=45;
Edit1.Text:= DatPreob(i);
end;

end.


Digitman   (2004-09-27 09:53:00) [6]


> r9000


каксделал ? конкретно ? код показывай ...


r9000   (2004-09-27 09:48:00) [7]

Да я так и сделал, но почему при закрытии формы вылезает эта ошибка и как ее устранить?


Digitman   (2004-09-27 09:35:00) [8]


> r9000


общего случая так же не существует
конкретная реализация ДЛЛ зависит от конкретного хост-приложения, в котором планируется использовать эту ДЛЛ

данныйслучай - лишь частный случай, где хост-приложение и ДЛЛ разработаны в одной и той же среде, и совместное их использование не выходит за рамки Делфи-соглашений, поэтому данный случай требует либо сборки обоих проектов с ран-тайм пакетами либо указания ShareMem в первойпозиции USES-списка обоих проектов


r9000   (2004-09-27 09:32:00) [9]

Да теперь вроде бы отрабатывает правильно, но позакрытию формы выдает ошибку 'Invalid Pointer Operation'. Что делать?


ssk   (2004-09-27 09:17:00) [10]

ShareMem должен быть прописан самым первымв списке uses'ов в DLL, а также самым первымв списке uses'ов файла .dpr проекта.


r9000   (2004-09-27 09:17:00) [11]

А в общем случае не для  IB?


Digitman   (2004-09-27 09:10:00) [12]

этот пример вообще не подходит для IB

IB ничего не знает ни о каких string


r9000   (2004-09-27 09:05:00) [13]

Ну в общем то да. Но сейчас просто на таком примере пытаюсь выяснить, где в данном случае ошибка?


Digitman   (2004-09-27 08:58:00) [14]


> r9000


надо понимать, ты пытаешься написать UDF для IB-сомвестимого сервера ?


r9000   (2004-09-27 08:55:00) [15]

Непонятно как убрать эту ошибку


r9000   (2004-09-27 08:48:00) [16]

Да вы правы, сейчас вроде выполняется, но выдает при этом ошибку
'Invalid Pointer Operation'.


Cobalt   (2004-09-27 08:38:00) [17]

<Режим телепатии>
Соответственно, Sharemem не нужен.
Проконсультируйся с руководством разработчика используемой тобой СУБД - как писать UDF-библиотеки.
</Режим телепатии>


Cobalt   (2004-09-27 08:33:00) [18]

2 r9000
А что за ошибка? при компиляции?
P.S. попробуй указать параметр не var.
P.P.S. Откуда ты такой стиль функции надыбал-то?


r9000   (2004-09-27 08:30:00) [19]

Прописал ShareMem в dll:
library udf1_dll;

uses
 SysUtils,ShareMem,
 Classes;

{$R *.res}

function DatPreob(var InDate: integer): String; stdcall;
begin
Result:=inttostr(InDate);

end;
exports  DatPreob;

begin
end.

все равно выдает ошибку?


Skyle   (2004-09-27 08:12:00) [20]

Для начала uses ShareMem.


Наверх

Титульная страница Поиск, карта сайта Написать письмо