3

Firebird 2.5でC++ Builder 2010で単純なユーザー定義関数(UDF)を作成しようとしましたが、Firebirdで機能しません。C++ビルダー2010でFirebird 2.5のユーザー定義関数を作成

extern "C" __declspec(dllexport) int __stdcall MYFUNC (int i) 
{ 
    int result = 2 * i; 
    return result; 
} 
  • : "ibase.h" と "ib_util.h" など、私の例のUDFでユニットを追加するC++ Builderの2010

  • のデフォルト設定とDLLプロジェクトの作成

    1. 01のサンプルDBにIBExpertを経由して、私のUDFの登録パスにDLL FBUDFMBD.dllを構築C:\Program Files (x86)\Firebird\Firebird_2_5\UDF

    2. 私は、DLL-エクスポートMYFUNCとして私UDFを見ることができますPE情報 - エラーメッセージツールGExpertsで

      Invalid token. 
      invalid request BLR at offset 36. 
      function F_MYFUNC is not defined. 
      module name or entrypoint could not be found. 
      

    select F_MYFUNC(3) from RDB$DATABASE; 
    

    結果とUDFを呼び出す

    DECLARE EXTERNAL FUNCTION F_MYFUNC 
    INTEGER 
    RETURNS INTEGER 
    ENTRY_POINT 'MYFUNC' MODULE_NAME 'FBUDFMBD'; 
    
  • ordinal $1およびエントリポイント$1538

    私は間違っていますが、Firebirdは自分のDLLとそのUDFを正しく登録できません。

    私のDLLプロジェクトには、デフォルトのコンパイラオプションに関する変更がありますか? Delphiで

  • +0

    私の経験では、Firebird UDFの質問 - 通常、ここでは多くの回答を得られません。 Firebirdサポートメーリングリストで質問することも考えてみてください。 –

    +0

    私は100%確信していませんが、 'extern" C "__declspec(dllexport)'を削除する必要があると思います。https://github.com/FirebirdSQL/firebird/blob/8905e15435116bfac3abb30ae476d4812d1fe04b/src /extlib/ib_udf.cpp –

    答えて

    2

    、私は私はいくつかの

    に助けを願っC++ __cdecl

    上たぶんcdeclなくstdcall

    すなわち

    function ExisteBase(const aBase:PChar):Integer; cdecl; 
    

    ない

    function ExisteBase(const aBase:PChar):Integer; stdcall; 
    

    を書くことができます

    2

    ありがとうございました!私はあなたの助けによってそれを手に入れました。

    トップ2:修正しC++ - コードは次のとおりです。入力パラメータの参照呼び出しに

    extern "C" __declspec(dllexport) int MYFUNC (int * val) 
    { 
        int result = 2 * *val; 
        return result; 
    } 
    

    ご注意ください。

    トップ4:は大手に

    DECLARE EXTERNAL FUNCTION F_MYFUNC 
    INTEGER 
    RETURNS INTEGER BY VALUE 
    ENTRY_POINT '_MYFUNC' MODULE_NAME 'FBUDFMBD'; 
    

    注意を払うことにより、Firebirdの2.5デシベルでUDFを登録するには、関数名にアンダースコア!

    トップ5:select F_MYFUNC(3) from RDB$DATABASE;が本当にうまく機能します。

    +0

    ..そして今私は文字列パラメータを使っています。 –

    関連する問題