2016-07-21 34 views
3

我試圖用C++ Builder 2010爲Firebird 2.5創建一個簡單的用戶定義函數(UDF),但是我沒有設法讓它在Firebird中工作。用C++ builder 2010爲firebird 2.5創建用戶定義函數

  1. 創建與C++ Builder的2010
  2. 默認設置一個DLL項目中添加一個單位與我的例子UDF包括 「ibase.h」 和 「ib_util.h」:

    extern "C" __declspec(dllexport) int __stdcall MYFUNC (int i) 
    { 
        int result = 2 * i; 
        return result; 
    } 
    
  3. 01號樓的DLL FBUDFMBD.dll路徑C:\Program Files (x86)\Firebird\Firebird_2_5\UDF

  4. 註冊通過IBExpert我的UDF的示例數據庫

    DECLARE EXTERNAL FUNCTION F_MYFUNC 
    INTEGER 
    RETURNS INTEGER 
    ENTRY_POINT 'MYFUNC' MODULE_NAME 'FBUDFMBD'; 
    
  5. 調用UDF與

    select F_MYFUNC(3) from RDB$DATABASE; 
    

    導致錯誤信息

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

與工具GExperts - 體育信息我可以看到我的UDF作爲DLL的出口MYFUNC序號$1和入口點$1538

我在做什麼錯,Firebird無法正確註冊我的DLL和它的UDF?

有沒有什麼在我的DLL項目中改變有關默認編譯器選項?

+0

以我的經驗Firebird UDF問題 - 通常 - 在這裏沒有得到很多答案;您也可以考慮在Firebird支持郵件列表上詢問您的問題。 –

+0

我不是100%確定,但我相信你需要刪除'extern「C」__declspec(dllexport)',在https://github.com/FirebirdSQL/firebird/blob/8905e15435116bfac3abb30ae476d4812d1fe04b/src中尋找一個例子/extlib/ib_udf.cpp –

回答

2

在Delphi中,你可以寫cdecl,而不是stdcall

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

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

也許在C++ __cdecl

我希望在一些

幫助
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'; 

注重註冊UDF的火鳥2.5分貝到前導下劃線在函數名!

top 5:select F_MYFUNC(3) from RDB$DATABASE;工作真不錯!

+0

..現在我繼續使用字符串參數。 –