1

メッセージのstd::stringとしてポインターを渡し、文字列を取得するか、メイン ウィンドウのメッセージ ハンドラーで取得する必要があります。LPARAMWM_USERchar*WM_USER

それ、どうやったら出来るの ?

私が今していること (これは、本来あるべき結果を生成していないため、正しくありません):

PostMessage(hwnd, LP_DOWNLOADUPDATE, (WPARAM)hHandleToWindow, (LPARAM)&remSize);

グローバル変数remSizeはどこにありますか。sdt::string remSize;

そして、私がやっているメッセージハンドラーで:

SetWindowText( (HWND)wParam, (char*)lParam );
4

4 に答える 4

6

Cスタイルの文字列、つまりゼロで終了する文字配列へのポインタを取得する必要があります。

PostMessage( hwnd, LP_DOWNLOADUPDATE, (WPARAM)hHandleToWindow, remSize.c_str() );

remSizeメッセージが処理されたことを確認できるまで、スコープから外れないようにしてください。そうしないと、ダングリングポインタが発生します。

于 2012-12-10T09:22:02.557 に答える
1

代わりに、パスを渡してconstに変換する(LPARAM)&remSize必要があります(つまり、インスタンスからポインターを抽出するため)。(LPARAM) remSize.c_str()std::stringchar*std::string

于 2012-12-10T09:22:46.367 に答える
1

のアドレスを送信し、std::stringそれをとして解釈していますchar*。これは機能しません。送信されたポインタを解釈する必要があります- std::string:のアドレスとして

SetWindowText( (HWND)wParam, ((std::string*)lParam)->c_str() );
于 2012-12-10T09:22:21.190 に答える
1

呼び出しを使用PostMessageするとすぐに戻り、メッセージは受信スレッドのメッセージ キューに入れられます。参照先のオブジェクトがスコープ外になると、受信コードは存在しないオブジェクトを参照することになります。これは未定義の動作です。

代わりに、 を使用SendMessageしてデータを渡します。その後、受信者はデータをコピーし、PostMessage(必要に応じて)使用して、後でデータを処理することを思い出させることができます。

とにかく、へのポインターで開始するとstd::string、レシーバーはそれをchar const*または他の無関係な型にキャストできません。へのポインターを渡し、受信側でstd::stringへのポインターとして解釈します。std::stringまたは、ポインターを渡し、受信側でchar const*ポインターとして解釈します。char const*


要約:

  • SendMessageではなく を介して、ポイント先のデータを渡しPostMessageます。

  • PostMessage必要に応じて、何かの後の処理を呼び出すために使用します。

  • 関連のない型の間でポインターをキャストしないでください。

于 2012-12-10T09:32:21.877 に答える