2010-01-13 25 views
0

在WinCrypt.h我看到:转换:#定义XXXXXX((LPCSTR)4)

#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变量的指针?

回答

1

有时,API会接受一个参数,该参数可能是知名对象的“cookie”或ID或指向名称的指针(例如),这似乎就是这种情况。 4是众所周知的CERT_CHAIN_POLICY_SSL政策的Cookie /处理/ ID。 API的某些用户可能会提前指定一个不为库所知的策略,但是可以通过它可以在某处查找的名称(或类似于注册表,配置文件或其他名称)指定该策略。

以某种相似的方式,GetProcAddress()可以带一个指向你想要的地址的函数的名字的指针(它现在是99%的时间使用的),或者指向字符串的指针可以是一个指定函数序数的数字。

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

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

+0

伟大的工作,现在我的答案不会被投票,因为你的更长! :) – wj32 2010-01-13 09:38:37

1

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

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

你可以把这个讨厌的铸件为做

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

没有一个偷懒的方法,你不能一个指针传递给一个BYTE持有的价值。这将导致C API“看到”一个指向真值地址(该字节的地址)的指针值,而不是作为它期望的指针传递的小整数。

没有字符串,它只是使用指针值本身。它恰好被声明为一个指向字符串的指针并不重要,它也可以是一个指向float的指针,或者(更好)void*

1

你必须明白一些API被设计得尽可能短而紧凑,即使这意味着可能会让用户感到困惑。例如CreateDialog函数允许你指定一个字符串资源标识符。但是你也可以指定整数标识符。所以微软决定你可以在同一个参数中传递一个整数ID(一个指针!)。这可能与此相同 - 此功能可能允许您指定字符串策略ID 的整数。为了紧凑,两种形式都在相同的论点中传递。

+0

只是好奇,当指针是所需的值时,你会如何指向一个字符串策略? – 2010-01-13 10:09:45

+0

您传递字符串指针。对可能的整数标识符的范围会有一些限制 - 例如,可以为它们保留低于0x1000的值,因为这些页面实际上是不可用的并且不可能包含字符串。 – wj32 2010-01-13 23:00:21