关于xloper xll测试的问题

问题描述

代码如下:

'''
int __stdcall xloper_type(const xloper *type){
   if(type->xltype&~(xlbitXLFree|xlbitDLLFree)==xltypeRef)
        return xltypeRef;
}
'''

为什么在测试指针类型的 xltype 时使用 ~(xlbitXLFree|xlbitDLLFree)??谢谢!

解决方法

以下是 xlcall.h 中定义 XLOPER 数据类型的相关部分。我不知道 OP 的代码(无论是 XLOPER 还是 XLOPER12)中如何定义“xloper”(小写),但对于 XLOPER,xltype 成员是一个无符号整数(WORD)。每个位对应一个不同的标志,因此您可以使用按位运算。

xlbitXLFree 和 xlbitDLLFree 是指示谁(Excel 或您)负责清理分配给 OPER 的任何内存(例如,如果它包含字符串或数组)的位。因此,通常情况下,如果您为 xll 中的 OPER 分配任何内存,则 xlbitDLLFree 位将被设置为 1,并且 Excel 会希望您在之后进行整理(将 OPER 传递给应在您的某个位置声明的 xlAutoFree() 函数) xll 代码).

所以

type->xltype&~(xlbitXLFree|xlbitDLLFree)

在按位 AND NOT() 操作中将内存分配位清零,只留下基本类型。例如,如果你从 Excel 接收到一个字符串到你的代码中,它的 xltype 很可能是 xltypeStr & xlbitXLFree(Excel 会整理),所以 0x1002,它不等于 xltypeStr (0x0002),因此需要在之前进行逐位运算您检查 OPER 基础类型。

一种更简洁的编写方式可能是(取决于需求)

if(type->xltype & xltypeRef) {}

因为如果匹配 xltypeRef (0x0008) 的位在 type->xltype 中设置,则结果将为非零 (true)。

/*
** XLOPER and XLOPER12 data types
**
** Used for xltype field of XLOPER and XLOPER12 structures
*/

#define xltypeNum        0x0001
#define xltypeStr        0x0002
#define xltypeBool       0x0004
#define xltypeRef        0x0008
#define xltypeErr        0x0010
#define xltypeFlow       0x0020
#define xltypeMulti      0x0040
#define xltypeMissing    0x0080
#define xltypeNil        0x0100
#define xltypeSRef       0x0400
#define xltypeInt        0x0800

#define xlbitXLFree      0x1000
#define xlbitDLLFree     0x4000