0

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

我的尝试(下)只是产生了胡言乱语

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

 _postData = (LPVOID)postData.c_str();

 _postData_len = 47;

 return false;
}

任何帮助将非常感激

谢谢

4

4 回答 4

1

注意 c_str() 的行为。它返回的 char* 是临时的,在字符串被修改或破坏后会失效。这很可能在使用 _postData 之前发生,可能在 setPostData() 返回时立即发生。你需要复制它。

下一个问题是 c_str() 不返回 LPCWSTR,它是 LPCSTR。演员无法转换它,这会产生中文。您需要使用例如 MultiByteToWideChar() 将其转换为 Unicode 字符串。

于 2010-02-06T03:28:38.697 回答
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;
于 2010-02-06T03:14:59.480 回答
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; 
}

但是您必须保证您通过引用传递的字符串对象 aspostData将至少在_postData指向它时保持活动状态。实际上,_postData指向返回的内部位置c_str()

此外,您似乎将使用c_str()as返回的值LPWSTR。要使用 LPWSTR,您需要从 ANSI 转换为宽字符,例如,使用MultiByteToWideChar函数。

换句话说,从一个指针到另一个指针的转换本身不是问题。问题是保证正确的对象生命周期和使用。

于 2010-02-06T03:41:30.710 回答
0

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

现在仔细阅读上述声明。

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

然后您必须知道将这些参数传递给的函数将处理这些指针指向的内存。它只是阅读它还是修改它?如果是 LPVOID,它将如何解释它。

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

于 2010-02-06T03:44:46.107 回答