2010-02-06 57 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()方法?