Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизРабота с 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c