你怎么知道结构中的某些字段是数组?

时间:2018-05-11 06:05:07

标签: c windows winapi code-signing authenticode

我正在查看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。我可以在代码中看到rgValuergAttr都作为数组访问,例如。

pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,

如果我没有看到这个例子,我永远不会得到这个。是特定于Windows还是我对C中的结构和类型声明完全无知?

2 个答案:

答案 0 :(得分:2)

rgAttrrgValue是指向struct的类型指针:

typedef struct _CRYPT_ATTRIBUTES *PCRYPT_ATTRIBUTES;
typedef struct _CRYPT_ATTRIBUTE *PCRYPT_ATTRIBUTE;

现在当您PCRYPT_ATTRIBUTE rgAttr时,struct _CRYPT_ATTRIBUTE *rgAttrCRYPT_ATTRIBUTE *rgAttr将会有效。

一般来说,在typedef上使用pointers只有缺点。 typedefpointer实际上有用的唯一情况是指针是函数指针。

答案 1 :(得分:1)

请注意,MS在匈牙利风格的名字装饰中非常不变," rg"前缀告诉你,即使没有去过文档,它也是一个数组。