[英]Covert String to LPVOID and LPCWSTR in C++
我正在使用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;
}
任何幫助將非常感激
謝謝
注意c_str()的行為。 它返回的char *是臨時的,在修改或破壞字符串后,它將變為無效。 這很可能在使用_postData之前發生,也可能在setPostData()返回時立即發生。 您需要復制它。
下一個問題是c_str()不返回LPCWSTR,它是LPCSTR。 演員無法將其轉換,從而產生中文。 您需要使用例如MultiByteToWideChar()將其轉換為Unicode字符串。
用這個:
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;
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
問題是,您必須保證至少在通過pv
指針訪問/使用數據的過程中, i
將保持生命。 您必須考慮您的w
因此,您可以這樣做:
bool httpWrapper::setPostData(const string &postData){
_postData = reinterpret_cast<LPVOID>(postData.c_str());
return false;
}
但您必須保證,您以引用方式作為postData
傳遞的字符串對象至少在_postData
指向它postData
會一直存在。 實際上, _postData
指向c_str()
返回的內部位置
另外,看來您將使用c_str()
返回的值作為LPWSTR
。 要使用LPWSTR,您需要使用MultiByteToWideChar函數將ANSI轉換為寬字符。
換句話說,從一個指針到另一個指針的轉換本身並不是問題。 問題是要保證適當的對象生存期和使用率。
當然,有一種方法可以將您的字符串轉換為某種形式,您可以輸入一個地址,並將其作為LPCWSTR或LPVOID傳遞(對於LPVOID,它可能會有所不同)。
現在,請仔細閱讀以上聲明。
要知道該怎么做,首先您必須知道LPCWSTR和LPVOID是什么。 我有一個奇怪的直覺,覺得那可能是一些指針。 MSDN可能會有所幫助。 例如在這里嘗試
然后,您必須知道將這些參數傳遞到的函數將與那些指針指向的內存有關。 它會只是閱讀還是修改它? 以及在LPVOID的情況下如何解釋它。
因為我不知道API,所以我無法為您提供LPVOID,但LPCWSTR建議您必須創建一個將以只讀方式終止的空終止寬字符串。 如何創建一個wstring並使用它的c_str()方法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.