【问题标题】:WinHttpSendRequest returns ERROR_INVALID_PARAMETERWinHttpSendRequest 返回 ERROR_INVALID_PARAMETER
【发布时间】:2016-08-23 04:45:13
【问题描述】:

我正在尝试让 betfair API 与 Windows API 一起使用。

我无法使用以下代码登录(用户名和密码已更改)。

char *headers = "X-Application: MakJhSABCDq8sbPIr\r\nAccept: application/json";

char *usernameandpassword = "username=mick&password=xyz123";

WinHttpSendRequest(
                    hrequest,
                    (LPCWSTR)headers,
                    -1,
                    usernameandpassword,
                    strlen(usernameandpassword),
                    strlen(usernameandpassword),
                    0);

但调用返回值为 ERROR_INVALID_PARAMETER。但我不知道哪个参数不好。

【问题讨论】:

  • 当你对编译器撒谎时会发生这种情况。当你说你的文字是宽字符时你撒谎了。

标签: c winapi


【解决方案1】:

LPCWSTR 作为const wchar_t* 的类型定义。在 Windows 上,它使用 UTF-16 编码。基本上,您将 8 位 ASCII 字符串 (headers) 类型转换为 16 位宽字符串,并告诉 WinHttpSendRequest() 计算字符串长度,但由于它不是有效的宽字符串,因此失败。

解决方案是首先使用适当的宽字符串:

const wchar_t *headers = L"X-Application: MakJhSABCDq8sbPIr\r\nAccept: application/json";

无论如何,用char* 指向字符串文字是错误的,因为字符串文字不可修改,修改它们是未定义的行为。它应该始终是const

【讨论】:

  • AFAIK,使用非常量 char * 访问字符串文字没有任何问题。第二部分为真(不可修改)
  • 我没有注意到强制的 wchar_t。我仍然可以使用 strlen() 吗?
  • @Mick 是的。尽管在我看来,使用 C 来实现这一点确实没有意义。如果你改用 C++,这些讨厌的小错误中的大多数都会在不损失任何性能的情况下消失。
  • @DavidHaim:C++ 有什么帮助? (LPCWSTR)headers.c_str() 真的会更安全吗?它会解决或防止任何错误吗?
  • static_cast<LPWSTR> 将无法编译。你展示的是 C 风格的转换,而不是 C++
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
相关资源
最近更新 更多