首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用c++builder 2010为FireBird2.5创建用户定义函数

用c++builder 2010为FireBird2.5创建用户定义函数
EN

Stack Overflow用户
提问于 2016-07-21 15:55:12
回答 2查看 1.6K关注 0票数 3

我尝试用C++ Builder2010为FireBird2.5创建一个简单的用户定义函数(UDF),但我无法让它在Firebird中工作。

  1. 在C++ Builder 2010中创建具有默认设置的DLL项目。
  2. 用我的示例UDF添加一个单元,包括"ibase.h“和"ib_util.h": 导出"C“__declspec(dllexport) int __stdcall MYFUNC ( int I){ int结果=2* i;返回结果;}
  3. 在路径FBUDFMBD.dll中生成DLL FBUDFMBD.dll
  4. 通过IBExpert在样例db withDECLARE外部函数F_MYFUNC整数中注册UDF,返回整数ENTRY_POINT 'MYFUNC‘MODULE_NAME 'FBUDFMBD';
  5. 调用UDF 从数据库中选择F_MYFUNC( 3); 结果出现错误消息 无效令牌。在偏移量36处请求BLR无效。未定义函数F_MYFUNC。找不到模块名称或入口点。

使用工具GExperts - PE信息,我可以看到我的UDF是DLL-导出MYFUNC序号$1和入口点$1538

我做错了什么,Firebird不能正确注册我的DLL和它的UDF?

我的DLL项目中是否有任何关于默认编译器选项的更改?

EN

回答 2

Stack Overflow用户

发布于 2016-07-22 05:28:04

在Delphi中,您可以编写cdecl而不是stdcall

i.e

代码语言:javascript
复制
function ExisteBase(const aBase:PChar):Integer; cdecl;

代码语言:javascript
复制
function ExisteBase(const aBase:PChar):Integer; stdcall;

也许在C++ __cdecl

我希望我能帮上忙

票数 2
EN

Stack Overflow用户

发布于 2016-07-22 10:25:10

非常感谢!我得到了你的帮助。

前2名:更正的C++代码是:

代码语言:javascript
复制
extern "C" __declspec(dllexport) int MYFUNC ( int * val )
{
   int result = 2 * *val;
   return result;
}

注意输入参数的引用调用。

顶级4:在FireBird2.5db中注册UDF

代码语言:javascript
复制
DECLARE EXTERNAL FUNCTION F_MYFUNC
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT '_MYFUNC' MODULE_NAME 'FBUDFMBD';

注意函数名的前导下划线!

前5名: select F_MYFUNC( 3 ) from RDB$DATABASE;工作得很好!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38508901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档