在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字符串实际上是一个单字节的“字符串”(即一个字节)吗?
当转换到另一种支持字节变量的语言时,我只需创建一个bVar (一个字节变量)并将其赋值为4,然后我就可以传递一个指向该字节变量的指针?
发布于 2010-01-13 17:36:25
有时,API会接受一个参数,该参数可以是知名对象的“cookie”或ID,也可以是指向某个名称的指针(例如),这里就是这种情况。4是熟知的CERT_CHAIN_POLICY_SSL策略的cookie/handle/ID。API的一些用户可能预先指定了一个库不知道的策略,但指定了一个名称,它可以在某个地方查找(或像注册表、配置文件或其他文件)。
在某种程度上类似的是,GetProcAddress()可以将指针指向您想要获得地址的函数的名称(目前99%的时间都是这样使用的),或者指向字符串的指针参数可以是指定函数序号的数字。
像这样重载指针参数是一种不幸的技术,有时被用来使API更灵活。幸运的是,这并不是特别常见。
无论如何,如果您想要从另一种语言调用此接口并指定CERT_CHAIN_POLICY_SSL策略,则需要为指针的值传递一个4 (而不是指向值4的指针)。
发布于 2010-01-13 17:19:04
指针没有指向任何东西。在32位系统上,它将是一个值为0x00000004的指针(几乎可以肯定是无效的)。
至于其他语言,例如在C#中,它很可能被编组为System.IntPtr。
你可以认为这种令人讨厌的造型是一种懒惰的方式。
union StringOrInteger
{
const char* str;
int n;
};发布于 2010-01-13 17:33:44
您必须了解,有些API被设计得尽可能简短紧凑,即使这可能会让用户感到困惑。例如,CreateDialog函数允许您指定字符串资源标识符。但您也可以指定整数标识符。因此,Microsoft决定您可以在同一参数(指针!)中传递一个整数ID。这里可能是一样的-这个函数可能允许您指定一个字符串策略ID或一个整数。为简洁起见,这两种形式都在同一个参数中传递。
https://stackoverflow.com/questions/2055518
复制相似问题