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

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()また、として返される値を使用するようですLPWSTRLPWSTRを使用するには、たとえばMultiByteToWideChar関数を使用して、ANSIからワイド文字に変換する必要があります。

言い換えれば、あるポインタから別のポインタへの変換自体は問題ではありません。問題は、適切なオブジェクトの寿命と使用法を保証することです。

于 2010-02-06T03:41:30.710 に答える
0

もちろん、文字列を何かに変換する方法はあります。のアドレスを取得して、LPCWSTRまたはLPVOIDとして渡すことができます(LPVOIDの場合は別のものになる可能性があります)。

ここで、上記のステートメントを注意深く読んでください。

何をすべきかを知るには、まずLPCWSTRとLPVOIDが何であるかを知る必要があります。私はそれらがいくつかの指針であるかもしれないと感じている奇妙な腸を持っています。MSDNが役立つ場合があります。たとえば、ここで試してください

次に、これらのパラメータを渡す関数が、それらのポインタが指すメモリとどのように関係するかを知る必要があります。それはただそれを読むのでしょうか、それともおそらくそれを修正するのでしょうか?そして、LPVOIDの場合、それはどのように解釈されますか。

APIがわからないため、LPVOIDを使用することはできませんが、LPCWSTRは、読み取られるだけのnullで終了するワイド文字列を作成する必要があることを示しています。wstringを作成し、そのc_str()メソッドを使用するのはどうですか?

于 2010-02-06T03:44:46.107 に答える
0

これを使って:

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

 _postData = (LPWSTR)postData.c_str(); 

 _postData_len = 47; // Something else, actually.

 return false; 
}

LPWSTR _postData;

LPCWSTR を期待するメソッドに LPWSTR を渡すことができます。したがって、文字列を操作できます。

ところで、文字列自体を渡そうとしましたか?私はそれもうまくいくと期待しており、LPWSTRを出すよりも優れています.

したがって、その場合は次のようになります。

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

 _postData = postData; 

 _postData_len = 47; // Whatever.

 return false; 
}
string _postData;
于 2010-02-06T03:14:59.480 に答える