我有以下 C++ 代码从 HttpContext 实例中检索标头请求信息:
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER(pHttpContext);
UNREFERENCED_PARAMETER(pProvider);
PCSTR header = pHttpContext->GetRequest()->GetHeader("Accept", NULL);
WriteEventViewerLog(header);
如您所见,调用:
pHttpContext->GetRequest()->GetHeader("Accept", NULL)**
返回 PCSTR 数据类型。
但是我需要将带有标题的 WriteEventViewerLog 作为“LPCWSTR”提供,因为我在方法中使用的函数之一只接受该格式的字符串。
来自https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx,关于这些字符串定义:
指向以空字符结尾的 8 位 Windows (ANSI) 字符的常量字符串的指针。有关详细信息,请参阅字体使用的字符集。
此类型在 WinNT.h 中声明如下:
typedef CONST CHAR *PCSTR;
和 LPCWSTR:
指向 16 位 Unicode 字符的以空字符结尾的常量字符串的指针。有关详细信息,请参阅字体使用的字符集。
此类型在 WinNT.h 中声明如下:
typedef 常量 WCHAR *LPCWSTR;
我没有找到从这两种数据类型转换的方法。我尝试将header转换为char*,然后使用下面的函数从char*移动到LPCWSTR:
LPWSTR charArrayToLPWSTR(char *source)
{
// Get required buffer size in 'wide characters'
int nSize = MultiByteToWideChar(CP_ACP, 0, source, -1, NULL, 0);
LPWSTR outString = new WCHAR[nSize];
// Make conversion
MultiByteToWideChar(CP_ACP, 0, source, -1, outString, nSize);
return outString;
}
但这返回给我一个无效的字符串(我没有完整的输入,但 Accept 标头值被修剪为“x;ih”)。