主页
Top.Mail.Ru Yandeks.Metrika
论坛:“基地”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

IB SQL UDF 找到类似的分支


Nebula   (2002-07-05 14:51) [0]

问题的继续。 创建一个库后,该函数返回一个字符串。

函数MyUDF:字符串;
开始
结果:=“文本”;
结束;

IB中描述。

DECLARE外部功能星云
返回VARCHAR(1024)字符集WIN1251
ENTRY_POINT“ MyUDF”
MODULE_NAME“路径\ MyUDF.dll”

怎么称呼? 选择MyUDF不起作用。



Val   (2002-07-05 15:02) [1]

你怎么这么称呼她 您不写选择总和,例如?



Johnmen   (2002-07-05 15:03) [2]

1。 dll应该在acc中。 地方
2。 可以全部使用现有的库吗?



kaif   (2002-07-05 15:10) [3]

您需要为字符串分配内存(GetMem),返回PChar,而不是字符串,并在UDF声明中使用FREE_IT。 将功能声明为stdcall并从dll导出(导出)。



Nebula   (2002-07-05 15:42) [4]

2Johnmen。 非常高兴! 使用哪个库?



Johnmen   (2002-07-05 15:48) [5]

ib_udf.dll



Digitman   (2002-07-05 17:35) [6]

关于kaif©(05.07.02 15:10)的简短说明

将任何东西返回到dan时,根本不需要free_it说明符。 案例-线。

在从结果存储块中读取返回的参数的值之后,要求该说明符告知服务器IB内核有关需要自动释放UDF主体中分配的存储块以传输某个(任意类型,在1转弯字符串中)返回参数的需要。 。 如果不这样做,将发生内存泄漏,并且服务器的后果将不可预测。



kaif   (2002-07-05 17:46) [7]

> 2 Digitman。
我知道 没错,我认为FREE_IT仅用于字符串...

顺便说一句,感谢示例FormatDateTime。 他赚了。
然后我对FormatFloat感到有点痛苦...
最后,终于有可能接受dll类型
双精度:

函数FmtIBDouble(FmtStr:PChar;值:指针):PChar; stdcall;
VAR
Tmp:字符串;
开始
尝试
Tmp:= FormatFloat(字符串(FmtStr), 双倍(值^));
......等

奇怪,但是通过引用传递(常量值:double)无效。 这不是我第一次使用dll时遇到此问题。 这与取消引用指针相同吗?
显然,我不了解有关通过引用传递参数的基本知识...



Digitman   (2002-07-05 18:22) [8]

>>我不了解有关通过引用传递参数的基本知识...

这是肯定的)...但是-自我批评并引起真正的尊重。

规则№1(了解我们的父亲-将来会有所帮助):

绝对所有事实参数都由IB服务器的核心通过指向原始参数的TEMPORARY COPY的服务器AP中的位置的链接(指针)由IB服务器的核心传输到UDF。

因此直接得出结论:

在UDF本身中声明参数必须至少以两种方式完成(让我们以相同的Double为例)

1。 var值:Double
2。 [const]值:PDouble,其中PDouble = ^ Double;

[const]-一个可选的说明符,对于UDF,如果存在或不存在,则绝对没有区别

因此,从UDF调用传递的参数值应如下所示:


1。 SomeLocalVar:=值;
2。 SomeLocalVar:=值^; 在这里,取消引用直接指针


为了不卡在AV中,应该始终考虑这样一件事:如果传输的事实参数= Null,则将nil传递给UDF,并进行检查以避免AV很容易:

1。 如果已分配(@Value),则...

@-这是编译器的默认操作,充其量没有“ ram”,充其量将检查未传递的nil链接,但最糟糕的是,该链接上的实际内容将拒绝编译

2。 如果已分配(值),则...


另一个要点:在导出函数的声明中没有stdcall! 只有 CDECL 将正常工作! 为什么呢 看一下“调用约定”主题中的帮助主题-鉴于IB内核从被调用的cdecl函数返回时在调用和堆栈平衡方面使用了C协议这一事实,区别将立即变得显而易见。



Digitman   (2002-07-05 18:28) [9]

一个小小的澄清:将Null参数传递给字符串参数的规则不适用,并且在这种情况下,如果Assigned(..)始终为True,因为在UDF调用时包含的TEMPORARY内存块的地址是唯一传送的字符是#0(字符串终止符)



kaif   (2002-07-06 02:26) [10]

> 2 Digitman
感谢您的详细解释。 特别是关于调用方法。 事实是,我的stdcall调用可以在Interbase中工作,而我的UDF则可以在没有明显问题迹象的情况下工作。 在我看来,IB从来不需要cdecl。 出于习惯,我进入了stdcall。 我知道这些调用原理的区别,但是在我看来,所有Win32应用程序通常都使用stdcall,至少是所有API。 但事实证明,IB的行为有所不同...
现在,我将看到NULL(忘记检查)会发生什么。 也就是说,字符串NULL只是空字符串吗? 但是IB区分“”和NULL。 还是传递参数时一样?



Страницы: 1 整个分支

论坛:“基地”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上





内存:0.59 MB
时间:0.03 c
1-95444
唐达
2002-07-16 00:02
2002.07.29
MDI到DLL


3-95268
Valeris
2002-07-05 16:14
2002.07.29
我受苦了一个星期


1-95301
RV
2002-07-16 11:01
2002.07.29
控制台窗口,获取信息


4-95618
狐狸
2002-05-23 08:40
2002.07.29
OS关机


6-95482
uncle_m16
2002-05-18 12:53
2002.07.29
请告诉我!!





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法语
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 淡米尔文 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский