![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с 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.