在C ++中将String转换为LPVOID和LPCWSTR

时间:2010-02-06 02:28:59

标签: c++ string winhttp

我正在使用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;
}

非常感谢任何帮助

由于

4 个答案:

答案 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()方法?