首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换:#define xxxxxx ((LPCSTR) 4)

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

Stack Overflow用户
提问于 2010-01-13 17:10:52
回答 4查看 173关注 0票数 0

在WinCrypt.h中,我看到:

代码语言:javascript
复制
#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,然后我就可以传递一个指向该字节变量的指针?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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的指针)。

票数 1
EN

Stack Overflow用户

发布于 2010-01-13 17:19:04

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

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

你可以认为这种令人讨厌的造型是一种懒惰的方式。

代码语言:javascript
复制
union StringOrInteger
{
  const char* str;
  int n;
};
票数 1
EN

Stack Overflow用户

发布于 2010-01-13 17:33:44

您必须了解,有些API被设计得尽可能简短紧凑,即使这可能会让用户感到困惑。例如,CreateDialog函数允许您指定字符串资源标识符。但您也可以指定整数标识符。因此,Microsoft决定您可以在同一参数(指针!)中传递一个整数ID。这里可能是一样的-这个函数可能允许您指定一个字符串策略ID或一个整数。为简洁起见,这两种形式都在同一个参数中传递。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2055518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档