[Firebird-jp-general] UDFでFB2.5(Win32)がクラッシュしてしまう

Back to archive index

渡辺 watan****@novel*****
2017年 7月 14日 (金) 17:07:56 JST


渡辺です。

 わかりました。

 Delphiで作ったDllの問題でした。

 https://www.firebirdsql.org/en/writing-udfs-in-delphi-for-interbase-firebird/

 に間違いがあり、
 stdcallではなくcdeclが正しいようです。

 誤
 function AddFunction(var Width,Height:Integer):Integer;stdcall;

 正
 function AddFunction(var Width,Height:Integer):Integer;cdecl;

 ※ 引数のvarは必須です。

 ちなみに、文字列を返すFunctionは
http://www.firebirdfaq.org/faq83/
 にあるようにfunction ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';  を使う必要があります。  使わないと、これを使ったメモリーじゃないよ、的なエラーメッセージが出ます。    またDelphi2009以降のUnicode版Delphiでは、これもそのページに書いてありますが、  PCharではなくPAnsiCharを使えば問題なく動作します。  ただ、このページでも気になる点があり、 function ChangeMyString(const p: PAnsiChar): PAnsiChar; cdecl; var s: string; begin s := DoSomething(string(p)); Result := ib_util_malloc(Length(s) + 1);//ここ StrPCopy(Result, AnsiString(s)); end; length(s)だと日本語ではうまくいかない感じがします。 やるなら var s:ansistring; にしてしまうか、 Result := ib_util_malloc(length(ansistring(s)) + 1); とするのが良いように思います。 FireBird-Support メーリングリストの 2014/10/7 [firebird-support] Creating UDF - stdcall vs cdecl を参考にしました。



On 2017/07/14 10:30, 渡辺 wrote:
> 渡辺です。
>
>  追記です。
>
>  FireBird2.5の上でまったく新しいDBを作り、
>  https://www.firebirdsql.org/en/writing-udfs-in-delphi-for-interbase-firebird/
>  にある方法で、
>     Delphi2007(ユニコード対応していないバージョンで)
>  で作成したDLLを
> declare external function f_AddFunction
> Integer, Integer
> returns
> Integer by value
> entry_point 'AddFunction' module_name 'nUDF.dll';
>  で定義し、
>
>  select f_addfunction(10,20) from rdb$database
>  としただけでもFireBird サーバがクラッシュしてしまいます。
>
>  何かお気づきの方いらっしゃいましたらお願いします。
>
>
> On 2017/07/14 9:42, 渡辺 wrote:
>> 渡辺です。
>>
>>  FB2.1上で動いていたUDFを
>>  Windows10にインストールしたFireBird2.5で動かそうとすると、
>>  サーバがクラッシュしてしまいます。
>>
>>  Windows10にインストールしたのは 32bit版の2.5.7.27050。
>>      d:\FireBirdフォルダに入れてあります。
>>
>>  ※ ProgramFilesフォルダにインストールしてみましたが、
>>   管理者権限のあるTeraPadなどでaliases.confなどを編集する必要があり、
>>   このあたりが問題なのかもと思って、
>>   完全にアンインストールしてから、
>>   d:\FireBirdにインストールしなおしました。
>>
>>  使っているDLLはDelphi製で、UDFフォルダの下に入れてあります。
>>
>>  functionの定義はこんな感じです。
>>
>> SQL> show function nCOmmatexti;
>> Function NCOMMATEXTI:
>> Function library is nFB1.dll
>> Entry point is nCommaTextI
>> Returns  BY VALUE INTEGER
>> Argument 1: CSTRING(5000) CHARACTER SET SJIS_0208
>> Argument 2: INTEGER
>> Argument 3: INTEGER
>>
>>  作ったのがかなり古いので、DelphiXE5で再コンパイルしてみましたが、
>>  同じようにFBサーバがクラッシュします。 
>>  
>>  データベースファイルは単に2.1のところから2.5へコピーをしただけではだめかもと思い、
>>  FB2.5でバックアップ、リストアをしてみましたが、効果はなく
>>  サーバがクラッシュしてしまいます。
>>
>>  ログなども見当たらず、
>>  何か手がないかと探しております。
>>
>>  なにかお気づきのことがある方、ご意見などお願いします。
>>
>>
>


-- 
/////ノベルット///////////////////////////////////////////////
 株式会社 ノベルット ソフトウェア インダストリー
  代表取締役 渡辺 伸雄
 〒144-0043 東京都 大田区 羽田2-12-3
 Tel:03-5705-2595
 Fax:03-6423-9505
 mobile-phone:080-3430-2595 070-5582-6540
   Email:watan****@novel*****
///////////////////////////////////////////////ノベルット/////

-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
下载 



Firebird-jp-general メーリングリストの案内
Back to archive index