你怎么知道结构中的某些字段是数组?
How do you know that some fields in structs are arrays?
我正在查看 Microsoft wincrypt.h
头文件中的这段 C 代码
//+-------------------------------------------------------------------------
// Attributes
//
// Where the Value's PATTR_BLOBs are in their encoded representation.
//--------------------------------------------------------------------------
// certenrolls_begin -- CRYPT_ATTRIBUTE
typedef struct _CRYPT_ATTRIBUTE {
LPSTR pszObjId;
DWORD cValue;
PCRYPT_ATTR_BLOB rgValue;
} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;
typedef struct _CRYPT_ATTRIBUTES {
DWORD cAttr;
PCRYPT_ATTRIBUTE rgAttr;
} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
// certenrolls_end
我是 运行 这个例子 How To Get Information from Authenticode Signed Executables。我可以在代码中看到 rgValue
和 rgAttr
都作为数组访问,例如
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,
如果我没有看到这个例子,我永远不会明白这个。是 Windows 特定的东西还是我对 C 中的结构和类型声明一无所知?
rgAttr
和 rgValue
是指向 struct
的指针类型:
typedef struct _CRYPT_ATTRIBUTES *PCRYPT_ATTRIBUTES;
typedef struct _CRYPT_ATTRIBUTE *PCRYPT_ATTRIBUTE;
现在,当您执行 PCRYPT_ATTRIBUTE rgAttr
时,它将等同于 struct _CRYPT_ATTRIBUTE *rgAttr
和 CRYPT_ATTRIBUTE *rgAttr
。
一般来说,在 pointers
上使用 typedef
只有缺点。 pointer
上的 typedef
实际上有用的唯一情况是指针是函数指针。
PCRYPT_ATTR_BLOB
是 CRYPT_ATTR_BLOB*
,指向 CRYPT_ATTR_BLOB
的指针。这可以是指向单个值的指针,也可以是指向数组的指针。您无法从类型声明中分辨出来,必须阅读文档。
cValue
A DWORD value that indicates the number of elements in the rgValue
array.
rgValue
Pointer to an array of CRYPT_INTEGER_BLOB structures.
所以在这种情况下 rgValue
是一个指向数组的指针。
请注意,MS 在匈牙利风格的名称修饰中非常稳定,"rg" 前缀告诉您它是一个数组,即使不查看文档也是如此。
我正在查看 Microsoft wincrypt.h
头文件中的这段 C 代码
//+-------------------------------------------------------------------------
// Attributes
//
// Where the Value's PATTR_BLOBs are in their encoded representation.
//--------------------------------------------------------------------------
// certenrolls_begin -- CRYPT_ATTRIBUTE
typedef struct _CRYPT_ATTRIBUTE {
LPSTR pszObjId;
DWORD cValue;
PCRYPT_ATTR_BLOB rgValue;
} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;
typedef struct _CRYPT_ATTRIBUTES {
DWORD cAttr;
PCRYPT_ATTRIBUTE rgAttr;
} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
// certenrolls_end
我是 运行 这个例子 How To Get Information from Authenticode Signed Executables。我可以在代码中看到 rgValue
和 rgAttr
都作为数组访问,例如
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,
如果我没有看到这个例子,我永远不会明白这个。是 Windows 特定的东西还是我对 C 中的结构和类型声明一无所知?
rgAttr
和 rgValue
是指向 struct
的指针类型:
typedef struct _CRYPT_ATTRIBUTES *PCRYPT_ATTRIBUTES;
typedef struct _CRYPT_ATTRIBUTE *PCRYPT_ATTRIBUTE;
现在,当您执行 PCRYPT_ATTRIBUTE rgAttr
时,它将等同于 struct _CRYPT_ATTRIBUTE *rgAttr
和 CRYPT_ATTRIBUTE *rgAttr
。
一般来说,在 pointers
上使用 typedef
只有缺点。 pointer
上的 typedef
实际上有用的唯一情况是指针是函数指针。
PCRYPT_ATTR_BLOB
是 CRYPT_ATTR_BLOB*
,指向 CRYPT_ATTR_BLOB
的指针。这可以是指向单个值的指针,也可以是指向数组的指针。您无法从类型声明中分辨出来,必须阅读文档。
cValue
A DWORD value that indicates the number of elements in the rgValue array.
rgValue
Pointer to an array of CRYPT_INTEGER_BLOB structures.
所以在这种情况下 rgValue
是一个指向数组的指针。
请注意,MS 在匈牙利风格的名称修饰中非常稳定,"rg" 前缀告诉您它是一个数组,即使不查看文档也是如此。