在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变量的指针吗?
答案 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*
。