| 
| Егоров | 
| Отправлено: 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 |  |  
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Уразумел, спасибо! Всё заработало. |  
|  |  |