我正在查看Microsoft wincrypt.h
头文件
//+-------------------------------------------------------------------------
// 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中的结构和类型声明完全无知?
答案 0 :(得分:2)
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
将会有效。
一般来说,在typedef
上使用pointers
只有缺点。 typedef
上pointer
实际上有用的唯一情况是指针是函数指针。
答案 1 :(得分:1)
请注意,MS在匈牙利风格的名字装饰中非常不变," rg"前缀告诉你,即使没有去过文档,它也是一个数组。