Егоров |
Отправлено: 20.08.2005, 15:28 |
|
Не зарегистрирован
|
Люди добрые, помогите, кто может !
(Билдер 6, FB 1.5)
Почитал про создание DLL и UDF, создаю в DLL-wizard пробную dll, вот полный код cpp:
CODE | #include <windows.h>
#include "stat.h"
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
int get_x_two(int i) // тренировочная функция
{
return(i*2);
} |
header такой:CODE |
#ifndef __STAT_H
#define __STAT_H
#if defined(__cplusplus)
extern "C"
{
#endif
__declspec( dllexport ) int get_x_two(int id);
#if defined(__cplusplus)
}
#endif
#endif // __STAT_H |
В базе функция объявлена так:SQL | DECLARE EXTERNAL FUNCTION GET_X_TWO
INTEGER
RETURNS INTEGER
ENTRY_POINT 'get_x_two' MODULE_NAME 'stat.dll' |
При выполнении (в IBExpert) пробного запроса
SQL | select * from my_table where id=get_x_two(3) |
сервер падает. Что я делаю не так ? |
|
Admin |
Отправлено: 22.08.2005, 00:35 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Как научиться писать UDF для InterBase за 21 мин.
http://www.ibase.ru/devinfo/udf_ok.htm
---------------------
Объявляете ее в базе как:
SQL | DECLARE EXTERNAL FUNCTION GET_X_TWO
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'get_x_two' MODULE_NAME 'STAT.DLL' |
Саму dll пишите так:
CODE |
extern "C" int __declspec( dllexport ) get_x_two(int *i);
int n;
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
int get_x_two(int *i)
{
n = *i * 2;
return n;
}
|
ну запрос оставляем как есть
select * from my_table where id=get_x_two(3)
Все работает. Как говориться — найди три отличия.
В общем разберитесь с передачей параметров в функцию
и механизме возврата (по значению или по ссылке).
P.S. Да, и проверьте куда вы положили саму dll чтобы сервер БД
о ней знал.
Отредактировано Admin — 22/08/2005, 00:47
|
|
Егоров |
Отправлено: 22.08.2005, 07:25 |
|
Не зарегистрирован
|
Уразумел, спасибо! Всё заработало. |
|
|