渡辺
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... 下载