|
|
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Есть проблемма нужно строку вида 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 обрывает связь. Помогите чайнику, где лажа? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 06:59 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
1. Насколько я помню dll негативно относится к типам String, ShortString, AnsiString. Скорее всего менеджер памяти подцеплять надо. Либо обойтись простым типом char. 2. Все функции должны быть совместимы с extern "C" и т.д. Если ты уже успешно писал работающие UDF, попробуй тип char, если не писал научись, может IB не видит точку входа в DLL, посмотри логи. Что там? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 08:32 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 09:46 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Попробуй закоментировать тело своей функции целиком. Затем откомпилируй и обратись к UDF из БД. Если проблема останется - учись писать dll на Delphi (тут я не помошник, у меня только на C++Builder и проблем с Dll нет) Если изчезнет будем думать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 10:40 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
1. Как объявляешь UDF в базе? 2. Не заюзан ли часом в dll-ке модуль ShareMem? Если да, то выкидывай его нафиг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 10:56 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Вот это работает: Function PTN(IN_P:Pchar):PChar; cdecl; export; begin Result:=IN_p; end; Exports PTN index 1 name 'PTN'; Begin end. Теперь появился следующий вопрос как из строки '11.12' убрать точку используя только PCHAR функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 10:58 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Значит, так. Подключай ibutil.pas, выделяй память под результат с помощью ib_util_malloc(), декларируй функцию с FREE_IT. У тебя проблема в StrPCopy(Res,Out_Schet) - куда она по-твоему пишет строку? На что указывает Res? И как эта строка будет освобождаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 11:06 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Теперь пробуй так. Если по С++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 11:07 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Как Выделить память с помощью ib_util_malloc(), что за входной параметр типа integer? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 11:55 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Размер блока памяти, вестимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 13:06 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Делаю так: 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. Не работает, что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 13:30 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
В IB публикую так. DECLARE EXTERNAL FUNCTION PTN CSTRING (256) RETURNS CSTRING (256) FREE_IT ENTRY_POINT 'PTN' MODULE_NAME 'conv_ML.dll'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 13:32 |
|
||
|
Помогите с UDF
|
|||
|---|---|---|---|
|
#18+
Всем огромное спасибо все пошло, не знаю по чему но вместо 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. """"" Вот так не верь глазам своим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2004, 13:55 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32393282&tid=1579298]: |
0ms |
get settings: |
6ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
218ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 566ms |

| 0 / 0 |
