Firebird 4 UDR创建报错‘Invalid entry point’求助
FireDac执行UDR函数创建脚本报“Invalid entry point”的解决方案
在Firebird 4环境中,使用isql可正常注册UDR函数,但通过Delphi 10.4的FireDac执行相同创建脚本时,会触发Invalid entry point错误,官方示例udrcpp_example.dll及自定义Delphi编写的UDR DLL均存在此问题,以下是可行的排查和解决方向:
排查方向与解决方法
1. 对齐FireDac连接参数与isql配置
FireDac默认连接属性可能与isql存在差异,需确保:
- 连接配置中
DataTypeCompatibility设置为3.0,与firebird.conf中的对应参数保持一致 - 确认FireDac使用的协议(如TCP/IP)与isql一致,避免协议差异导致的解析问题
- 关闭FireDac的
PrepareSQL选项,防止SQL被不必要的预处理修改
2. 验证位数匹配
UDR DLL的位数必须与Firebird服务器完全匹配:
- 确认Firebird服务器是32位还是64位,对应使用同位数的
udrcpp_example.dll - Delphi编译自定义UDR DLL时,选择与Firebird服务器一致的平台(32/64位),且编译选项中关闭无关设置(如“生成控制台应用程序”)
3. 调整FireDac SQL执行方式
使用ExecuteDirect直接执行原始SQL语句,避免参数化或预解析:
FDConnection1.ExecSQL('create function sum_args (n1 integer, n2 integer, n3 integer) returns integer external name ''udrcpp_example!sum_args'' engine udr;');
注意SQL字符串中引号的转义处理,确保脚本完整传递给Firebird服务器。
4. 确认连接用户权限
确保FireDac使用的连接用户拥有与isql相同的权限:
- 具备
CREATE FUNCTION系统权限 - 因
ExternalFileAccess已设为Full,需确认用户对UDR DLL所在目录有读取权限
问题背景参考配置
firebird.conf关键配置
ServerMode = Super DefaultDbCachePages = 20K FileSystemCacheThreshold = 2M TempBlockSize = 2M TempCacheLimit = 1500M AuthServer = Legacy_Auth, Srp, Win_Sspi AuthClient = Legacy_Auth, Srp, Win_Sspi UserManager = Legacy_UserManager, Srp WireCrypt = Enabled RemoteServicePort = 3054 DataTypeCompatibility = 3.0 LockMemSize = 15M LockHashSlots = 30011 UdfAccess = Restrict UDF ExternalFileAccess=Full
plugins/udr_engine.conf配置
external_engine = UDR { plugin_module = UDR_engine } plugin_module = UDR_engine { filename = $(this)/udr_engine plugin_config = UDR_config } plugin_config = UDR_config { path = $(this)/udr }
测试用UDR创建脚本
create function sum_args ( n1 integer, n2 integer, n3 integer ) returns integer external name 'udrcpp_example!sum_args' engine udr;
内容的提问来源于stack exchange,提问作者Michael Desboeufs
相关产品推荐
相关产品推荐

