簡體   English   中英

在C ++中將字符串轉換為LPVOID和LPCWSTR

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM