具有变体返回类型的 Delphi Excel UDF

Posted

技术标签:

【中文标题】具有变体返回类型的 Delphi Excel UDF【英文标题】:Delphi Excel UDF with Variant return Type 【发布时间】:2016-12-12 17:13:31 【问题描述】:

我有一个使用 ExecuteExcel4Macro 注册 UDF 的加载项。这工作正常。仅当加载项在当前会话中检测到兼容的工作簿时才会注册。

问题是我想改变当前的 UDF 从只返回一个 char 而是一个 char 或一个 excel 错误。

我找到了一些关于使用类型库的文章,但我相信这意味着我的 UDF 将始终被注册,并且我想控制何时注册它们。

我目前注册

ExcelApp.ExecuteExcel4Macro('REGISTER("filepath","add-in-name","AccountDescription","CC","Account Id","My Addin group")');

function AccountDescription ( sAccountId: PChar ) : PChar ; stdcall ;

我正在使用 add-in-express 来帮助实现 excel 自动化。 CC 表示该函数接受一个以空字符结尾的字符串,并期望返回一个以空字符结尾的字符串。我不确定是否可以指定一个变体,以便返回 Excel2000.xlErrNa。

编辑:上面的固定函数调用我忘了注册。

编辑(2): register函数中的第4个参数包含udf参数和返回值类型。我不确定如何表示变体。

编辑(3): dll / 项目称为 DynacViews2,在 DynacViews2.dll 源文件中有:

exports AccountDescription;

对不起,如果这有点支离破碎。我想强调的是,这目前正在使用上面的代码。问题是尝试更改 AccountDescription 的签名以返回 OleVariant 而不是 PChar。

更改的原因是我想返回一个字符串或 Excel 错误。其他在线示例包括 add-in-express,显示使用 TypeLibrary 添加函数并将返回类型指定为变体。这将使用 OleVariant 创建一个签名,并且可以返回一个字符串或 Excel 错误(Excel2000.xlErrNa)。问题是我使用 VBA REGISTER 函数仅在工作簿兼容时才添加 UDF。

我可能没有正确处理这个问题。

编辑 4: Example of Register usage - 此链接显示了寄存器的用法,但没有链接到任何微软网站,因此没有说明如何指定参数。

【问题讨论】:

google "delphi deborah pate excel udf" 它应该找到她的一篇旧帖子(她是 Borland TeamB 的成员),展示了如何在 Delphi 中编写 UDF,而不使用 Add-In Express"跨度> @alex 我没有找到太多。 Add-in-express 只是一个让使用 excel 变得更容易的工具。我正在使用 REGISTER 函数来帮助管理 UDF 是否已注册。 没有minimal reproducible example 提供帮助。在明确的支持中添加什么说。他们很棒。 他们也许你错过了她在这个线程中的帖子:v=delphigroups.info/2/48/258279.html 这是一个带有日期戳的星期日,格林威治标准时间 2005 年 7 月 3 日 00:13:20。顺便说一句,我知道 Add-In Express 是什么。 呃为什么 XLM 和 excel 4。那不是早于 VBA 和变体以及 com 等等。如果我是你,我会尝试以现代方式进行。 【参考方案1】:

根据Using the CALL and Register Functions,Variant 不在支持的数据类型中。

Code  Description                            Pass by               C Declaration
A     Logical (FALSE = 0), TRUE = 1)         Value                 short int
B     IEEE 8-byte floating-point number      Value (Windows)       double (Windows)
                                             Reference (Macintosh) double * (Macintosh)
C     Null-terminated string                 Reference             char *
      (maximum length=255)
D     Byte-counted string (first byte        Reference             Unsigned char *
      contains length of string, maximum 
      string length = 255 characters)
E     IEEE 8-byte floating-point number      Reference             double *
F     Null-terminated string (maximum        Reference (modify     char *
      string length = 255 characters)        in place)
G     Byte-counted string (first byte        Reference (modify
      contains length of string, maximum     in place)             unsigned char *
      string length = 255 characters)
H     Unsigned 2-byte integer                Value                 unsigned short int
I     Signed 2-byte integer                  Value                 short int
J     Signed 4-byte integer                  Value                 long int
K     Array                                  Reference             FP *
L     Logical (FALSE = 0, TRUE = 1)          Reference             short int *
M     Signed 2-byte integer                  Reference             short int *
N     Signed 4-byte integer                  Reference             long int *
O     Array                                  Reference             Three arguments are 
                                                                   passed:
                                                                   unsigned short int *
                                                                   unsigned short int *
                                                                   double [ ]
P     Microsoft Excel OPER data structure    Reference             OPER *
R     Microsoft Excel XLOPER data structure  Reference             XLOPER *

【讨论】:

谢谢!我知道我以前看到过那张桌子,但在谷歌上搜索了一天之后我再也找不到它了。

以上是关于具有变体返回类型的 Delphi Excel UDF的主要内容,如果未能解决你的问题,请参考以下文章

使用 Delphi 管理变体中的空值

将变体转换为双精度时出错 [ Delphi XE + IBObjects 4.9.12 ]

Delphi - 如何从函数返回不同的类型

我初学VB 、 谁能将一些基本常用函数发给我?

VB的所有命令函数呢?非常之感谢!

请问delphi中pchar()是个啥函数,返回啥值?