2010-02-06 59 views
0

我正在使用C++中的winHTTP API,并且我已经开始为我的应用程序编写包装类。为了简单起见,我有许多函数可以接受字符串参数并在winHTTP调用中使用它们。然而,其中许多要求数据是LPVOID或LPCWSTR。我可以通过使我的包装函数采用LPVOID或LPCWSTR参数来完成所有工作,但我更喜欢字符串参数。那么有没有什么办法可以转化为LPVOID/LPCWSTR?在C++中向LPVOID和LPCWSTR隐藏字符串

我尝试(下)刚生产jibberish

bool httpWrapper::setPostData(const string &postData){ 

_postData = (LPVOID)postData.c_str(); 

_postData_len = 47; 

return false; 
} 

任何帮助,将不胜感激

感谢

回答

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; 
1

小心为c_str的行为()。它返回的char *是暂时的,它在字符串被修改或销毁后将变为无效。在使用_postData之前可能会发生这种情况,可能会在setPostData()返回时立即发生。你需要复制它。

接下来的问题是,c_str()不返回一个LPCWSTR,它是一个LPCSTR。演员不能转换它,产生中文。您需要将其转换为Unicode字符串,例如MultiByteToWideChar()。

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转换为宽字符。

换句话说,从一个指针到另一个指针的转换本身不是问题。问题是保证适当的对象的使用寿命和使用。

0

当然,有一种方法可以将字符串转换为某种东西,您可以获取地址并将其作为LPCWSTR或LPVOID传递(对于LPVOID,它可能是不同的东西)。

现在仔细阅读上述说明。

要知道该怎么做,首先您必须知道LPCWSTR和LPVOID是什么。我有一种奇怪的直觉,那些可能是一些指针。 MSDN可能会有所帮助。尝试here例如

然后你必须知道什么函数,你传递这些参数,将与这些指针指向的内存。它会读取它还是修改它?在LPVOID的情况下如何解释它。

我不能帮助你LPVOID,因为我不知道API,但LPCWSTR建议你必须创建一个空终止的字符串,将被只读。如何创建一个wstring并使用它的c_str()方法?