转换:#define xxxxxx((LPCSTR)4)

时间:2010-01-13 09:10:52

标签: c++ variables

在WinCrypt.h中,我看到:

#define CERT_CHAIN_POLICY_SSL   ((LPCSTR) 4)

WINCRYPT32API BOOL WINAPI CertVerifyCertificateChainPolicy(
    IN LPCSTR pszPolicyOID,
    IN PCCERT_CHAIN_CONTEXT pChainContext,
    IN PCERT_CHAIN_POLICY_PARA pPolicyPara,
    IN OUT PCERT_CHAIN_POLICY_STATUS pPolicyStatus
    );

第一个参数采用CERT_CHAIN_POLICY_SSL。这似乎是一个指向C字符串的指针,但它是一个整数!?

指针显然是一个32位整数,但它指向什么? 如果数字是< 255它将占用一个字节,因此C字符串实际上是单字节“字符串”(即一个字节)?

当转向支持BYTE变量的另一种语言时,我可以创建一个bVar(一个BYTE变量)并分配它4.然后我可以传递一个指向该BYTE变量的指针吗?

4 个答案:

答案 0 :(得分:1)

指针没有指向任何东西。在32位系统上,它将是一个(几乎肯定是无效的)指针,其值为0x00000004。

至于其他语言,例如在C#中它很可能被编组为System.IntPtr。

你可以把这种令人讨厌的演员视为一种懒惰的做法

union StringOrInteger
{
  const char* str;
  int n;
};

答案 1 :(得分:1)

您必须了解某些API的设计尽可能短且紧凑,即使这意味着可能会让用户感到困惑。例如,CreateDialog函数允许您指定字符串资源标识符。但您也可以指定整数标识符。所以Microsoft决定你可以在同一个参数中传递一个整数ID(一个指针!)。这可能是相同的 - 这个函数可能允许您指定字符串策略ID 整数1。对于紧凑性,两种形式都在同一个参数中传递。

答案 2 :(得分:1)

有时,API会获取一个参数,该参数可以是知名对象的“cookie”或ID,也可以是指向名称的指针(例如),这就是这里的情况。 4是众所周知的CERT_CHAIN_POLICY_SSL政策的Cookie /句柄/ ID。 API的某些用户可能会指定一个提前未知库的策略,但是由一个可以在某处查找的名称(或者像注册表,配置文件或其他内容)指定。

在某种程度上类似的情况下,GetProcAddress()可以指向您想要地址的函数的名称(这是今天99%的时间使用它的方式),或指针指向a -string参数可以是指定函数序数的数字。

像这样重载指针参数是一种不幸的技术,有时用于使API更灵活。幸运的是,这并不是特别常见。

无论如何,如果您想从另一种语言调用此API并指定CERT_CHAIN_POLICY_SSL策略,则需要为指针的值传递4(而不是指向值4的指针)。

答案 3 :(得分:0)

不,你不能将指针传递给持有该值的BYTE。这将导致C API“看到”一个指针值,它是一个真正的地址(该BYTE的地址),而不是作为它所期望的指针传递的小整数。

没有字符串,只是单独使用指针值。它恰好被声明为指向字符串的指针并不重要,它也可以是指向浮点数的指针,或者(更好)void*