Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с UDF / 13 сообщений из 13, страница 1 из 1
30.01.2004, 06:59
    #32393008
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Есть проблемма нужно строку вида 12.2.3.4 переделать в строку вида
12020304
Пишу DLL

Function PTN(var IN_P:PCHAR):PCHAR; cdecl; export;
VAR
Out_Schet,IN_Schet,Stat:ShortString;
Res:pchar;
begin
In_Schet:=StrPas(In_P);
Out_schet:='';
Res:='';
Repeat
if (Pos('.',In_SCHET)=0) and (Length(In_SCHET)<>0)
then In_SCHET:=In_SCHET+'.';
Stat:='';
Stat:=copy(In_SCHET,1,Pos('.',In_SCHET)-1);
if length(Stat)<2 then Stat:='0'+Stat;
Out_Schet:=Out_Schet+Stat;
In_SCHET:=copy(In_SCHET,Pos('.',In_SCHET)+1,Length(In_Schet));
Until (Pos('.',In_SCHET)=0) and (Length(In_SCHET)=0);
StrPCopy(Res,Out_Schet);
Result:=Res;
end;
Exports
PTN index 1 name 'PTN';
Begin
end.

Пятый день мучаюсь. При вызове функции в IB обрывает связь.
Помогите чайнику, где лажа?
...
Рейтинг: 0 / 0
30.01.2004, 08:32
    #32393037
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
1. Насколько я помню dll негативно относится к типам String, ShortString, AnsiString. Скорее всего менеджер памяти подцеплять надо. Либо обойтись простым типом char.

2. Все функции должны быть совместимы с extern "C" и т.д.

Если ты уже успешно писал работающие UDF, попробуй тип char, если не писал научись, может IB не видит точку входа в DLL, посмотри логи. Что там?
...
Рейтинг: 0 / 0
30.01.2004, 09:46
    #32393118
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
1. Входные параметры я специально сделал Pchar, как я думаю какие типы крутятся внутри DLL не важно, вход и выход нужного типа.
2. Для совместимости пишу cdecl; export;
3. В логах Access violation.
The code attempted to access a virtual
address without privilege to do so.
This exception will cause the Firebird server
to terminate abnormally.
4. UDF раньше не писал, обходился готовыми, но опыт работы с DLL есть, но чисто на Delphi и для Delphi.
...
Рейтинг: 0 / 0
30.01.2004, 10:40
    #32393245
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Попробуй закоментировать тело своей функции целиком. Затем откомпилируй и обратись к UDF из БД.
Если проблема останется - учись писать dll на Delphi (тут я не помошник, у меня только на C++Builder и проблем с Dll нет)
Если изчезнет будем думать.
...
Рейтинг: 0 / 0
30.01.2004, 10:56
    #32393282
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
1. Как объявляешь UDF в базе?
2. Не заюзан ли часом в dll-ке модуль ShareMem? Если да, то выкидывай его нафиг.
...
Рейтинг: 0 / 0
30.01.2004, 10:58
    #32393285
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Вот это работает:
Function PTN(IN_P:Pchar):PChar; cdecl; export;
begin
Result:=IN_p;
end;
Exports
PTN index 1 name 'PTN';
Begin
end.

Теперь появился следующий вопрос как из строки '11.12' убрать точку используя только PCHAR функции.
...
Рейтинг: 0 / 0
30.01.2004, 11:06
    #32393300
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Значит, так. Подключай ibutil.pas, выделяй память под результат с помощью ib_util_malloc(), декларируй функцию с FREE_IT.

У тебя проблема в StrPCopy(Res,Out_Schet) - куда она по-твоему пишет строку? На что указывает Res? И как эта строка будет освобождаться?
...
Рейтинг: 0 / 0
30.01.2004, 11:07
    #32393303
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Теперь пробуй так.

Если по С++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Насколько я понял PChar и мой char* это одно и то же.
char* PTN(char* IN_P)
{
  char *C; // Временная переменная
  ShortString In_Schet;
  C = IN_P; // Присвоение временной переменной того, что пришло
  In_Schet =StrPas(C); // Далее работа с временной переменной.
  ....
}
Вообщем сделай аналогию на Паскале.
...
Рейтинг: 0 / 0
30.01.2004, 11:55
    #32393408
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Как Выделить память с помощью ib_util_malloc(), что за входной параметр типа integer?
...
Рейтинг: 0 / 0
30.01.2004, 13:06
    #32393571
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Размер блока памяти, вестимо.
...
Рейтинг: 0 / 0
30.01.2004, 13:30
    #32393629
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Делаю так:
library Conv_ML;
uses
SysUtils,Classes,ib_util;

Function PTN(var IN_P:PCHAR):PCHAR; cdecl; export;
VAR
Out_Schet,IN_Schet,Stat:ShortString;
begin
In_Schet:=StrPas(In_P);
Out_schet:='';
Repeat
if (Pos('.',In_SCHET)=0) and (Length(In_SCHET)<>0) then In_SCHET:=In_SCHET+'.';
Stat:='';
Stat:=copy(In_SCHET,1,Pos('.',In_SCHET)-1);
if length(Stat)<2 then Stat:='0'+Stat;
Out_Schet:=Out_Schet+Stat;
In_SCHET:=copy(In_SCHET,Pos('.',In_SCHET)+1,Length(In_Schet));
Until (Pos('.',In_SCHET)=0) and (Length(In_SCHET)=0);
Result:=ib_util_malloc(Length(Out_Schet)+1);
StrPCopy(Result,Out_Schet);
end;
Exports
PTN index 1 name 'PTN';
Begin
end.

Не работает, что не так?
...
Рейтинг: 0 / 0
30.01.2004, 13:32
    #32393635
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
В IB публикую так.
DECLARE EXTERNAL FUNCTION PTN
CSTRING (256)
RETURNS CSTRING (256) FREE_IT
ENTRY_POINT 'PTN' MODULE_NAME 'conv_ML.dll';
...
Рейтинг: 0 / 0
30.01.2004, 13:55
    #32393688
Kadi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с UDF
Всем огромное спасибо все пошло, не знаю по чему но вместо
Result:=ib_util_malloc(Length(Out_Schet)+1) было написано
GetMem(Result, Length(Out_Schet)+1)
Хотя я читал на
http://]www.ibase.ru/devinfo/udf_ok.htm

"""""А почему мы "распределяли" память таким способом, не проще ли было через GetMem?
К сожалению, нет. Функции GetMem и FreeMem работают с менеджером памяти Deplhi, который является "надстройкой" над менеджером памяти Win32. Поэтому, поручая IB DataBase "освободить" память, мы должны распределить ее "заранее оговоренным" способом, т.е. при помощи стандартной функции malloc. """""

Вот так не верь глазам своим.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите с UDF / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]