Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Работа с dll   Найти похожие ветки 

 
r9000   (2004-09-27 08:10) [0]

Добрый день!

Пытаюсь создать простую 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.

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


 
Skyle ©   (2004-09-27 08:12) [1]

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


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

Прописал 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.

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


 
Cobalt ©   (2004-09-27 08:33) [3]

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


 
Cobalt ©   (2004-09-27 08:38) [4]

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


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

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


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

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


 
Digitman ©   (2004-09-27 08:58) [7]


> r9000


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


 
r9000   (2004-09-27 09:05) [8]

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


 
Digitman ©   (2004-09-27 09:10) [9]

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

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


 
r9000   (2004-09-27 09:17) [10]

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


 
ssk ©   (2004-09-27 09:17) [11]

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


 
r9000   (2004-09-27 09:32) [12]

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


 
Digitman ©   (2004-09-27 09:35) [13]


> r9000


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

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


 
r9000   (2004-09-27 09:48) [14]

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


 
Digitman ©   (2004-09-27 09:53) [15]


> r9000


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


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

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.


 
Skyle ©   (2004-09-27 10:07) [17]


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

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


 
Cobalt ©   (2004-09-27 10:11) [18]

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

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


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

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


 
Vlad ©   (2004-09-27 10:15) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
14-1095858515
Mike B.
2004-09-22 17:08
2004.10.10
Модератор на рыбалке


4-1093986950
S@shka
2004-09-01 01:15
2004.10.10
нет работает SetWaitableTimer


1-1096360459
Суслик
2004-09-28 12:34
2004.10.10
Константное значение widestring


3-1094790123
NewDelpher
2004-09-10 08:22
2004.10.10
Эффективность запросов


1-1095870796
8ung
2004-09-22 20:33
2004.10.10
Unicode