|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
udf, Delphi, Interbase
|
|
Автор |
VladoVasilev (минаващ) |
Публикувано | 23.07.05 12:27 |
|
Здравейте!
Искам да си напиша едно .dll с няколко ф-ции, които после да използвам като udf-та в interbase. Проблема е с параметрите - входни/изходни, в interbase типа е double precision (double в Delphi), ама в .dll-то като какъв тип да ги обявя - май трябва да ползвам указатели??? Конкретно искам ф-ция която по зададено реално число х да отрязва всичко след к-тата цифра зад запетаята (К и Х са параметри) и да връща резултата....малко help?
| |
|
Това нещо с типа в DLL-а какъв да бъде не го разбрах... Double си е, нали все пак си го пишеш DLL-а на Делфи?
Ето ти няколко статийки по въпроса, които се надявам, че ще ти свършат добра работа.
Също така има и някои библиотеки, които можеш да ползваш за разработката на UDF-и. Виж и това:
Надявам се "малкото help" да ти е било от полза
Успех с писането!
| |
|
Явно грешката ми е много тъпа, ама...не иска и не иска - затова реших да попитам тук. Ето unit-a, в който ми е засега единствената ф-ция, която не работи :
"unit uDll;
interface
function RoundUp(num : Double; prec : integer) : Double; cdecl; export;
implementation
Function RoundUp(num : Double; prec : integer) : Double;
var i : integer;
begin
for i := 1 to prec do num := 10*num;
if abs(frac(num)) >= 0.5 then
if num < 0 then num := Trunc(num-1)
else num := Trunc(num+1)
else num := Trunc(num);
for i := 1 to prec do num := num/10;
Result := num;
end;
end."
Добавих си я като udf в interbase по следния начин:
////
DECLARE EXTERNAL FUNCTION ROUNDUP
DOUBLE PRECISION,
INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'RoundUp' MODULE_NAME 'uDll'
///
Когато пусна следната заявка:
"select roundup_1(2.34,1) from articleprice;" ми дава
"Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Access to UDF library "uDll.DLL" is denied by server administrator."
Четох в google, че това може да е от права, от конфигурационния файл на firebird или някаква друга неизвестна грешка. Някой да знае малко повече по въпроса - да не би ф-цията ми да не е правилно написана???
| |
|
Интересува ме:
С каква версия на Firebird си? Каква платформа? Каква файлова система? Каква е стойността на UdfAccess в конфигурационния файл? Къде ти се намира DLL-а?
| |
|
A, super - dobre che mi kaza da dam i malko oshte info - poneje imam i INTERBASE SERVER, i FIREBIRD server instalirani, sum kopiral dll-to pri udf-tata na interbase-a, ne na firebird-a....samo che neshto ne smiata kakto triabva, no tova veche sigurno e problem v source-to na samia dll - po-tochno taka kakto sum go napisal vinagi vrushta stoinost 0 - no tova shte go pogledna sega;
Interesno e vse pak, che v firebird.conf imam:
"#UdfAccess = Restrict UDF; d:\work_1\dll;"
i vupreki che v direktoria d:\work_1\dll imam file uDll.dll, pak mi davashe starata greshka....
| |
|
Махни '#'-то в началото на реда, че той е символа за коментар
| |
Тема
|
Re: Ама дай и малко инфо
[re: VladoVasilev]
|
|
Автор | eмил (Нерегистриран) |
Публикувано | 25.07.05 15:55 |
|
library uDll;
uses math;
function roundup(var Num: Double; var Prec: Integer): Double; cdecl;export;
var
LFactor: Double;
begin
LFactor := IntPower(10, Prec);
Result := Round(Num / LFactor) * LFactor;
end;
exports roundup;
{DECLARE EXTERNAL FUNCTION ROUNDUP
DOUBLE PRECISION, INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'roundup' MODULE_NAME 'UDll'}
begin
end.
По мотиви от функцията RoundTo в Делфи 7
(а ти май си с 5 :) а там я няма )
RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
| |
|
Мерси много, оправи се - проблема беше, че параметрите ми не бяха "var" - незнам все още защо, след като ф-цията си връща стойност (Result := .....), но след като ги сложих да са "var" всичко е ок. Странното е че дори когато единия параметър, който НИКЪДЕ НЕ ПРОМЕНЯМ да не е "var", пак не става - firebird-a направо умира :))
| |
Тема
|
Re: Ама дай и малко инфо
[re: VladoVasilev]
|
|
Автор | eмил (Нерегистриран) |
Публикувано | 26.07.05 08:11 |
|
Из:
"Как научиться писать UDF для IB Database за 21 мин."
http://www.isp.idknet.com/development/interbase/devinfo/udf_ok.htm
"Входные параметры (всегда передаются по ссылке)"
т.е. var :)
И още една много полезна връзка за всеки случай за всякакви
интербейси и огнени птици :)
http://www.ibase.ru
| |
Тема
|
Re: udf, Delphi, Interbase
[re: VladoVasilev]
|
|
Автор | TTRex (Нерегистриран) |
Публикувано | 27.07.05 20:08 |
|
Тъй като гледам, няма нужда нито от dll, нито от udf, ами трябва да се прочете какво прави "CAST"
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|