C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
UDF убивает сервер, где я неправ ?
Егоров
Отправлено: 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)

сервер падает. Что я делаю не так ? sad.gif
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


Не зарегистрирован







Уразумел, спасибо! Всё заработало.

Вернуться в Работа с базами данных в C++Builder