我正在用C编写一些WinHttp代码,我通过SSL发送请求,为了处理SSL错误,我通过调用WinHttpSetStatusCallback (将dwNotificationFlags设置为WINHTTP_CALLBACK_STATUS_SECURE_FAILURE )注册了一个dwNotificationFlags。
WINHTTP_STATUS_CALLBACK的文档说,当用dwInternetStatus
= WINHTTP_CALLBACK_STATUS_SECURE_FAILURE调用回调时,它表明
从服务器检索安全套接字层(SSL)证书时遇到一个或多个错误。lpvStatusInformation参数包含一个标志。有关更多信息,请参见lpvStatusInformation的说明。
现在,lpvStatusInformation
参数被键入为LPVOID。但我从文档中的声明中可以看出,在WINHTTP_CALLBACK_STATUS_SECURE_FAILURE的情况下,它不被视为指针。
lpvStatusInformation
的医生说:
如果dwInternetStatus参数是WINHTTP_CALLBACK_STATUS_SECURE_FAILURE,则此参数可以是下列值之一。
...And这些值是这些十六进制值之一: 1,2,4,8,10,20,40。(见WinHttp.h)
我觉得这很清楚。我不应该为了得到值而取消引用指针。lpvStatusInformation
保存十六进制值,而不是指针。
我解释得对吗?
我用这种方式编写了我的代码,而且它在过去也起过作用。我认为!然而,现在我得到了0x0104f288的lpvStatusInformation
。这一点都不像那些十六进制值。也不可能通过OR‘in可能的值来创建这个值(尽管文档没有提到同一个DWORD中的多个状态项)。对我来说确实是个指针。当我删除指针时,得到0x8,它对应于WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
,这至少是有意义的。
问题是,我是否应该取消引用那个指针?
以下是回调代码:
void CALLBACK Iirf_WinHttpSslStatusCallback( HINTERNET hInternet,
DWORD_PTR context,
DWORD code,
void * pInfo,
DWORD infoLength)
{
if (code == WINHTTP_CALLBACK_STATUS_SECURE_FAILURE) {
ConfigInfo * cfg = (ConfigInfo *) context; // app-specific structure
DWORD details = (DWORD) pInfo; // do not de-reference??
CHAR buffer[32];
CHAR * statusDescription = NULL;
switch (details) {
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED:
statusDescription = "CERT_REV_FAILED";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT:
statusDescription = "INVALID_CERT";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED:
statusDescription = "CERT_REVOKED";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA:
statusDescription = "INVALID_CA";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID:
statusDescription = "CERT_CN_INVALID";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID:
statusDescription = "CERT_DATE_INVALID";
break;
case WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR:
statusDescription = "SECURITY_CHANNEL_ERROR";
break;
default:
statusDescription = buffer;
sprintf_s(buffer, 32, "stat(0x%08X) len(%d)",
details, infoLength);
break;
}
LogMessage(cfg, 1, "SslStatusCallback: %s", statusDescription);
}
}
发布于 2011-06-17 22:53:26
医生们有点误导人。lpvStatusInformation
是指向标志值的指针。我们一直将其转换为DWORD*并取消引用它,我们得到的值与文档中的标志值匹配。
https://stackoverflow.com/questions/4618121
复制相似问题