【问题标题】:C++ get the length of LPCWSTR and LPVOIDC++获取LPCWSTR和LPVOID的长度
【发布时间】:2014-05-27 14:54:36
【问题描述】:

winapi函数WinHttpSendRequest()想要第二个参数的大小在第三个,第四个参数的大小在第五个。
怎么计算?
我有一个围绕它的函数,我直接传递字符串,大约是这样的:

void Req(LPCWSTR headers, LPVOID body) {
    WinHttpSendRequest( hRequest, headers, (DWORD)strlen(headers), body, (DWORD)strlen(body), 0, 0 );
}
Req(L"User-Agent: blabla/1.0\r\nConnection: Keep Alive", "asdf=qwer&abcd=1234);

上面的代码不起作用。 :/
我希望你能帮助我。

【问题讨论】:

  • strlen 用于窄字符串,而不是宽字符串。 void * 没有长度可以获取。我建议为第二个参数使用一个实际的字符串,如果需要,它将隐式转换为 const void *
  • 如何将其转换为 const void *?
  • 如果您采用非常量字符串,它将自动执行此操作,否则它将转换为 const void *。由于该函数采用非常量,因此假设它不修改它是不安全的,并且修改字符串文字之类的东西非常糟糕。您始终可以获取一个 const 字符串并从中形成一个非常量字符串。并且可能使用实际的 C++ 字符串,这些字符串在您的函数中使用起来更加自然。
  • 请不要使用TCHAR之类的,它们仅用于移植古老的Windows程序。对于任何通信应用程序,请考虑使用UTF-8 everywhere
  • 我现在厌倦了这个:pastebin.com/LkZBJkA0 但即使 (DWORD)strlen(body) 似乎返回了正确的大小,我得到一个“无效参数”错误:msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c++ string-length lpcwstr


【解决方案1】:

。对于宽字符串,您需要使用wcslen 而不是strlen

【讨论】:

  • 这似乎适用于 LPCWSTR! :) 你知道类似 LPVOID 的一些功能吗?
  • @Forivin:那不存在
  • @Forivin 您需要知道body 的实际类型才能找到它的长度。如果它也是一个宽字符串,那么您可以在函数中将其强制转换,或者在函数头中接受它。
  • 如果未定义 unicodeLPCWSTR 将转换为 LPCSTR。因此,如果未定义 unicode,那么您会将 char* 传递给接受 wchar_t*wcslenmsdn.microsoft.com/en-us/library/windows/desktop/…
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多