none
Win32API 型変換について RRS feed

  • 質問

  • 型変換の質問なのですが,ご存知の方よろしくご指導お願いします.

    現在Win32 APIのプログラムで,

    プロシージャ内のデータを,別のプロシージャに送るためのプログラムを書いています.

    プログラムを以下に示します.

    Proc(略){

    ・・・

    COPYDATASTRUCT cd;

    cd.lpData = "送信データ";

    SendMessage( g_hDlg1 <別のダイアログのハンドル>, WM_COPYDATA , NULL , (LPARAM)&cd<送信データ >);

    ・・・

    }

    これを別のプロシージャのメッセージのWM_COPYDATAで受け取ります,

    Proc2{

    ・・・

    switch (message) {

    case WM_COPYDATA:

    <データを受け取る処理>

    <ここでstring型で受け取りたい>

      ・・・

    }

    ・・・

    }

    これが一連のプログラムです.

    COPYDATASTRUCT のメンバであるPVOID型で受け取ったデータを,

    stringで処理したいのですが,PVOID型からstring型への変換方法を教えてください.

    宜しくお願いします.

    2011年5月31日 11:10

回答

  • よく質問を拝見したら、

    cd.lpData = "送信データ";
    

    と記述がありましたね。失礼しました。

     

    WM_COPYDATAは受信したメッセージのlParamにCOPYDATASTRUCTへのポインタがセットされていますので、

    MSG msg;
    // 中略
    const COPYDATASTRUCT* pCDS = (const COPYDATASTRUCT*)msg.lParam;
    const char* psz = (const char*)pCDS->lpData;
    

    という感じで記述すれば文字列へのポインタは取得できると思います。

    ただし送信側でCOPYDATASTRUCTのcbDataに正しく値を設定しているときだけマトモに動作します。

    またハンドラから抜けたら文字列バッファとして使われている共有メモリはWM_COPYDATAの仕様上破棄されるので、必要に応じて文字列データをバックアップしなければなりません。

    2011年5月31日 11:32

すべての返信

  • string型とは何を指しているでしょうか?

    ・C言語におけるchar/wchar_tの配列。

    ・C++におけるstd::basic_string

    ・MFCにおけるCString

    ・COM/ATLにおけるBSTR、CComBSTR

    ・.NET FrameworkにおけるSystem.String

    ・その他

     

    Win32における標準の文字列型、というものはないと思います。

    2011年5月31日 11:16
  • よく質問を拝見したら、

    cd.lpData = "送信データ";
    

    と記述がありましたね。失礼しました。

     

    WM_COPYDATAは受信したメッセージのlParamにCOPYDATASTRUCTへのポインタがセットされていますので、

    MSG msg;
    // 中略
    const COPYDATASTRUCT* pCDS = (const COPYDATASTRUCT*)msg.lParam;
    const char* psz = (const char*)pCDS->lpData;
    

    という感じで記述すれば文字列へのポインタは取得できると思います。

    ただし送信側でCOPYDATASTRUCTのcbDataに正しく値を設定しているときだけマトモに動作します。

    またハンドラから抜けたら文字列バッファとして使われている共有メモリはWM_COPYDATAの仕様上破棄されるので、必要に応じて文字列データをバックアップしなければなりません。

    2011年5月31日 11:32
  • C++におけるstd::basic_stringのことです.
    2011年6月1日 4:07
  • ありがとうございます.

    キャストすることができました.

    Win32APIだと,様々な型変換をする機会が多くあって,

    大変ですね.

    2011年6月1日 4:19