其他数据类型的信息
本部分包含有关 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。