IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
FedorVlad
- Сообщения: 5
- Зарегистрирован: 14 ноя 2005, 11:22
Сообщение
FedorVlad » 12 мар 2007, 16:43
Решил розобраться с УДФ-ками под FB 1.5-2.0 на Borland C++ 5.0.
Начал искать - полно инфы под Делфи с примерами а вот на Borland C++ 5.0 нету. Попробовал скомпилить демку с FB 2.0 ib_udf получил DLL но при использовании функций выдаёт ошибку.
Invalid token.
invalid request BLR at offset 63.
function EAN13 is not defined.
module name or entrypoint could not be found.
Функция генерит пользовательский код для штрих кода EAN13
Код функции
Код: Выделить всё
//---------------------------------------------------------------------------
#include <stdlib.h>
#include <SysUtils.hpp>
#include "ibase.h"
extern "C" {
#include "ib_util.h"
};
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
char* F_CodedEAN13(int const *Cod)
{
char Znach[9];
itoa(*Cod,Znach,10);
char *sZn = "200000000000";
//********Длина строки целой части числа*******************
int Chl=strlen(Znach);
int j=0, ix = 11 - Chl;
for (int i = 3; i < 12 ;i++)
{
if (i > ix)
{
sZn[i]=Znach[j++];
}
}
return sZn;
}
//---------------------------------------------------
extern "C" char* ISC_EXPORT CodedEAN13(int const * Cod)
{
return F_CodedEAN13(Cod);
}
объявил функцию:
Код: Выделить всё
DECLARE EXTERNAL FUNCTION EAN13
INTEGER
RETURNS CSTRING(12) FREE_IT
ENTRY_POINT 'CodedEAN13' MODULE_NAME 'ean'
Буду весьма признателен за любую помошь!!!
Возможно у когото есть простой работаюший проектик под Borland C++ 5.0
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 12 мар 2007, 17:08
1. Убедись, что твоя длл не использует рантайм BC++ или оный рантайм лежит в доступном месте
2. Возьми Dependency Walker (или аналогичную тулзу) и убедись что все зависимости твоей длл разрешены, что ф-ция экспортирована и имеет то имя, которое ты от неё ожидаешь
3. Выделяй память под результат не в стеке, тем более что пишешь FREE_IT в декларации
-
FedorVlad
- Сообщения: 5
- Зарегистрирован: 14 ноя 2005, 11:22
Сообщение
FedorVlad » 13 мар 2007, 11:44
Весьма признателен всем, так как это моя первая длл-ка под FB.
Код: Выделить всё
#include <windows.h>
#include <stdlib.h>
#include "ibase.h"
#include "ib_util.h"
#pragma hdrstop
char* _CodedEAN13(int const * Cod);
extern "C" {
__declspec( dllexport ) char* ISC_EXPORT CodedEAN13(int const *Cod)
{
return _CodedEAN13(Cod);
}
};
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
char* _CodedEAN13(int const * Cod)
{
char Znach[9];
itoa(*Cod,Znach,10);
char *sZn = "200000000000";
//********Длина строки целой части числа*******************
int Chl=strlen(Znach);
int j=0, ix = 11 - Chl;
for (int i = 3; i < 12 ;i++)
{
if (i > ix)
{
sZn[i]=Znach[j++];
}
}
return sZn;
}
//------------------------------------------------------------
Файли
"ibase.h","ib_util.h" в папке \\Firebird_2_0\include\
Обїявление функции
Код: Выделить всё
DECLARE EXTERNAL FUNCTION EAN13
INTEGER
RETURNS CSTRING(12) FREE_IT
ENTRY_POINT 'CodedEAN13' MODULE_NAME 'ean'
работает 100%!
-
Dimitry Sibiryakov
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Сообщение
Dimitry Sibiryakov » 13 мар 2007, 12:50
работает 100%!
А не должно бы, ни с точки зрения С, ни с точки зрения FB.
Изменение константы вообще непонятно почему работает, а вот освобождение памяти, которая не выделялась вообще должно приводить к AV 100%. Почему не приводит - неясно. Двойка обычно падает на таких заворотах.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 13 мар 2007, 15:52
Короче. Автору топика читать исходники rfunc, например. А также FAQ про FREE_IT. Ну и статью Кукарцева про udf, туда же. пусть она и на паскале.