Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
11-1081262281
m5
2004-04-06 18:38
2004.10.10
Как сделать в КОЛ всплывающее окошко с подсказками?


10-1045474963
Vladimir
2003-02-20 11:03
2004.10.10
corba callback


14-1095839113
Программер_
2004-09-22 11:45
2004.10.10
Что-то я совсем запутался... чем может быть не надежн этот


1-1095937631
XM-AD
2004-09-23 15:07
2004.10.10
Как завершить процес???


4-1094144591
Einstein
2004-09-02 21:03
2004.10.10
Окно на WinApi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский