重要: 谨慎 注册表编辑不当可能会严重损坏操作系统,导致你必须重新安装它。 Microsoft 无法保证可解决因注册表编辑不当而引起的问题。 编辑注册表之前,请备份任何有价值的数据。 有关如何使用和保护计算机注册表的最新信息,请参阅 Microsoft Windows 帮助。
本文介绍 Microsoft Excel 中 CALL、REGISTER 和 REGISTER.ID 函数的公式语法和用法。
注意: CALL 和 REGISTER 函数在 Excel 网页版 中不可用。
本文内容
说明
以下说明了 CALL、REGISTER 和 REGISTER.ID 函数所使用的参数和返回值的数据类型。 在不同的操作环境中,参数和返回值略有不同,这些不同均标注在数据类型表中。
数据类型
在 CALL、REGISTER 和 REGISTER.ID 函数中,type_text 参数指定返回值的数据类型以及 DLL 函数或代码源的所有参数的数据类型。 type_text 的第一个字符指定返回值的数据类型。 其余字符表示所有参数的数据类型。 例如,如果返回浮点数的 DLL 函数以整数和浮点数作为参数,则 type_text 参数应为“BIB”。
下表给出一个完整列表,内容包括:Microsoft Excel 能识别的数据类型代码、每个数据类型的说明、参数或返回值的传送方式以及 C 语言中数据类型的典型声明。
代码 |
说明 |
传递方式 |
C 语言中的变量声明 |
A |
逻辑值 (FALSE = 0, TRUE = 1) |
值 |
short int |
B |
IEEE,8 字节浮点数 |
数值 (Windows)引用 (Macintosh) |
double (Windows)double * (Macintosh) |
C |
NULL 结尾字符串(字符串最大长度 = 255 个字符) |
引用 |
char * |
D |
字节计数字符串(第一个字节包含字符串的长度,字符串最大长度 = 255 个字符) |
引用 |
Unsigned char * |
E |
IEEE,8 字节浮点数 |
引用 |
double * |
F |
NULL 结尾字符串(字符串最大长度 = 255 个字符) |
引用(在原地修改) |
char * |
G |
字节计数字符串(第一个字节包含字符串的长度,字符串最大长度 = 255 个字符) |
引用(在原地修改) |
unsigned char * |
H |
无符号 2 字节整数 |
值 |
unsigned short int |
I |
带符号 2 字节整数 |
值 |
short int |
J |
带符号 4 字节整数 |
值 |
long int |
K |
Array |
引用 |
FP * |
L |
逻辑值 (FALSE = 0, TRUE = 1) |
引用 |
short int * |
M |
带符号 2 字节整数 |
引用 |
short int * |
否 |
带符号 4 字节整数 |
引用 |
long int * |
O |
Array |
引用 |
传递 3 个参数: unsigned short int * unsigned short int * double [ ] |
P |
Microsoft Excel OPER 数据结构 |
引用 |
OPER * |
R |
Microsoft Excel XLOPER 数据结构 |
引用 |
XLOPER * |
备注
-
C 语言变量声明基于下列假设:编译器默认值为 8 字节双精度数、2 字节短整数和 4 字节长整数。
-
在 Microsoft Windows 编程环境中,所有指针均为远指针。 例如,在 Microsoft Windows 中,必须将 D 数据类型代码 unsigned char far 。
-
DLL 和代码源中的所有函数是根据 Pascal 调用规范来调用的。 大多数 C 编译器可以通过在函数声明中增加 Pascal 关键字来使用 Pascal 调用规范,如下例所示: pascal void main (rows,columns,a)
-
如果函数使用按引用传递数据类型作为其返回值,则可以将 null 指针作为返回值传递。 Microsoft Excel 会将 null 指针解释为 #NUM! 错误值。
其他数据类型的信息
本部分包含有关 F、G、K、O、P 和 R 数据类型的详细信息,以及有关 type_text 参数的其他内容。
F 和 G 数据类型
使用 F 和 G 数据类型,函数可以修改由 Microsoft Excel 分配的字符串缓冲区。 如果返回值类型代码为 F 或 G,则 Microsoft Excel 将忽略由该函数返回的值。 但是,Microsoft Excel 将搜索函数参数表以查找第一个对应的数据类型(F 或 G),然后将分配的字符串缓冲区的当前内容作为返回值。 Microsoft Excel 为该参数分配 256 个字节,这样该函数返回的字符串可能比它接收的字符串大。
K 数据类型
K 数据类型使用一个指针指向一个大小可变的 FP 结构。 必须在 DLL 或代码源中定义该结构,如下所示:
typedef struct _FP
{ unsigned short int rows; unsigned short int columns; double array[1]; /* Actually, array[rows][columns] */ } FP;
声明 double array[1] 只为单元素数组分配存储空间。 实际数组中的元素个数等于行数乘以列数。
O 数据类型
O 数据类型只能用作参数,而不能作为返回值。 它传递三项:指向数组中行数的指针、指向数组中列数的指针以及指向浮点数的二维数组的指针。
函数可修改由 O 数据类型传递的数组来取代返回一个数值。 若要实现这一点,请将“>O”作为 type_text 参数。 有关详细信息,请参阅下面的“在原地修改,函数声明为 Void”。
创建 O 数据类型是为了直接与通过引用传递参数的 Fortran DLL 兼容。
P 数据类型
P 数据类型是一个指向 OPER 结构的指针。 OPER 结构包含 8 字节数据,后面跟着一个指定数据类型的 2 字节标识符。 使用 P 数据类型,DLL 函数或代码源可以读取并返回任意 Microsoft Excel 数据类型。
OPER 结构的定义如下:
typedef struct _oper
{
union { double num; unsigned char *str; unsigned short int bool; unsigned short int err; struct { struct _oper *lparray; unsigned short int rows; unsigned short int columns; } array; } val; unsigned short int type; } OPER;
类型字段包含下列值之一:
类型 |
说明 |
要使用的 Val 字段 |
1 |
数值 |
num |
2 |
字符串(第一个字节包含字符串长度) |
str |
4 |
布尔型(逻辑值) |
bool |
16 |
错误,错误值为: 0#NULL! 7#DIV/0! 15#VALUE! 23#REF! 29#NAME? 36#NUM! 42#N/A |
err |
64 |
Array |
array |
128 |
丢失参数 |
|
256 |
空白单元格 |
最后的两个数值只能用作参数,不能作为返回值。 当调用程序省略参数时,则传递丢失参数值 (128)。 当调用程序将引用传递给一个空白单元格时,则传递空白单元格值 (256)。
R 数据类型—从 DLL 中调用 Microsoft Excel 函数
R 数据类型是一个指向 XLOPER 结构的指针,XLOPER 结构是 OPER 结构的增强版本。 在 Microsoft Excel 4.0 及更高版本中,可以使用 R 数据类型来编写调用 Microsoft Excel 函数的 DLL 和代码资源。 使用 XLOPER 结构,DLL 函数除了传递数据外,还可以传递工作表引用并实现流控制。 对 R 数据类型和 Microsoft Excel 应用程序编程接口 (API) 的完整说明不在本主题讨论的范围之内。 《Microsoft Office XP 开发人员指南》给出了有关 R 数据类型、Microsoft Excel API 以及 Microsoft Excel 的其他技术的详细信息。
可变函数和重新计算
Microsoft Excel 通常只在 DLL 函数输入到单元格时、在函数的引用单元格之一更改时或者在使用宏的过程中计算单元格时,才计算 DLL 函数(或代码源)。 在工作表中,可以将 DLL 函数或代码源设置成可变的,这意味着每次工作表重新计算时,都会对该函数进行重新计算。 若要使函数成为可变的,请在 type_text 参数中添加一个感叹号 (!) 作为最后一个字符。
例如,在 Microsoft Excel for Windows 中,每次工作表重新计算时,都要对下列工作表公式进行重新计算:
CALL("Kernel32","GetTickCount","J!")
在原地修改,函数声明为 Void
可以使用一位数字 n 作为 type_text 中的返回类型代码,此处 n 为 1 到 9 之间的数字。 这将使 Microsoft Excel 对 type_text 中第 n 个参数指向的位置中的变量进行修改,而不返回值。 这也被称为在原地修改。 第 n 个参数必须是由引用传递的数据类型(C、D、E、F、G、K、L、M、N、O、P 或 R)。 DLL 函数或代码源也必须在 C 语言中用关键字 Void 声明(或者在 Pascal 语言中用关键字 procedure)。
例如,以 null 为终止的字符串和两个指向整数的指针作为参数的 DLL 函数可以在原地修改字符串。 用“1FMM”作为 type_text 参数,并将函数声明为 void。
在 Microsoft Excel 4.0 以前的版本中,用 > 字符在原地修改第一个参数,而无法修改第一个参数以外的其他参数。 在 Microsoft Excel 4.0 及更高版本中,> 字符等价于 n = 1。