我正在使用c ++中的winHTTP API,我已经开始为我的应用程序编写一个包装类。为简单起见,我有许多函数可以接受字符串参数并在winHTTP调用中使用它们。然而,其中许多要求数据是LPVOID或LPCWSTR。我可以通过使我的包装器函数采用LPVOID或LPCWSTR参数来完成所有工作,但我更喜欢字符串参数。那么有没有办法从sting转换为LPVOID / LPCWSTR?
我的尝试(下面)只是产生了胡言乱语
bool httpWrapper::setPostData(const string &postData){
_postData = (LPVOID)postData.c_str();
_postData_len = 47;
return false;
}
非常感谢任何帮助
由于
答案 0 :(得分:1)
小心c_str()的行为。它返回的char *是临时的,在修改或销毁字符串后它将变为无效。在使用_postData之前可能会发生这种情况,可能只要setPostData()返回就会发生。你需要复制它。
下一个问题是c_str()不返回LPCWSTR,它是LPCSTR。演员不能转换它,产生中文。您需要将其转换为Unicode字符串,例如MultiByteToWideChar()。
答案 1 :(得分:0)
使用此:
bool httpWrapper::setPostData(const string &postData){
_postData = (LPWSTR)postData.c_str();
_postData_len = 47; // Something else, actually.
return false;
}
LPWSTR _postData;
您可以将LPWSTR传递给期望LPCWSTR的方法。所以你可以使用字符串。
顺便说一下,你刚试过传递字符串吗?我希望它能够工作,并且比获得LPWSTR更好。因此,在这种情况下,它看起来像:
bool httpWrapper::setPostData(const string &postData){
_postData = postData;
_postData_len = 47; // Whatever.
return false;
}
string _postData;
答案 2 :(得分:0)
LPVOID只是void *,因此您可以将任何指针转换为它,因为任何指针都可以转换为void *。但是,它并不保证此操作会根据您的期望给出有效的结果。
简单地说,LPVOID用于根据以下方案的情况
int i = 10; // some real data
int* pi = &i; // pointer to data
// convert to opaque pointer, not usable (readable), onlly can be passed around
// for instance to thread procedure
void* pv = pi;
pi = reinterpret_cast<int*>(pv); // convert back to pointer to data
int j = *pi; // access real data
问题在于,您必须保证i
至少在通过pv
指针访问/使用数据时保持活动状态。你必须考虑你的w
所以,你可以这样做:
bool httpWrapper::setPostData(const string &postData){
_postData = reinterpret_cast<LPVOID>(postData.c_str());
return false;
}
但是您必须保证通过引用传递的字符串对象postData
将保持活动状态至少与_postData
指向它一样长。实际上,_postData
指向c_str()
此外,您似乎将c_str()
返回的值用作LPWSTR
。要使用LPWSTR,您需要使用MultiByteToWideChar函数将ANSI转换为宽字符。
换句话说,从一个指针到另一个指针的转换本身不是问题。问题是保证适当的对象寿命和使用。
答案 3 :(得分:0)
当然有一种方法可以将你的字符串转换成某种东西,你可以获取一个地址并将其作为LPCWSTR或LPVOID传递(如果是LPVOID,它可能是另一回事)。
现在仔细阅读上述声明。
要知道该怎么做,首先你必须知道LPCWSTR和LPVOID是什么。我有一种奇怪的直觉,那些可能是一些指针。 MSDN可能有所帮助。试试here例如
然后你必须知道你传递这些参数的函数是什么,这将与那些指针所指向的内存有关。它只是阅读它还是修改它?如果是LPVOID,它将如何解释呢。
我无法帮助您使用LPVOID,因为我不知道API,但是LPCWSTR建议您必须创建一个空的终止宽字符串,它将被读取。如何创建一个wstring并使用它的c_str()方法?