文字列の取り出しについて

解決


あくりる  2011-02-18 23:39:09  No: 72347

お世話になります。

VS2005 MFCダイアログベースのアプリを作成作成しています。

文字列データの受け渡しを行っているのですが
受け取り側で文字列が上手くとれず困っています。
何方か御教え頂けないでしょうか。1バイト文字列で行うと上手くいきます。

やりたいことは"テストデータ"の2バイト文字列を別のプロセスで取り出す事です。

HWND            sendWinClass;
HWND    recvWinClass;
WPARAM          wParam;
LPARAM          lParam;
COPYDATASTRUCT  cds;
CString    strSendData;
  
strSendData = _T( "テストデータ" );
//2バイト文字作成
TCHAR* sendData = new TCHAR[strSendData.GetLength() + 1];
_tcscpy_s( sendData, strSendData.GetLength() + 1, strSendData );

//1バイト文字列
//char *sendData = new char[strSendData.GetLength() + 1 ];
//strcpy_s( sendData, strSendData.GetLength() + 1, CStringA( strSendData ) );

cds.dwData = 1;
cds.cbData = strSendData.GetLength() + 1;
cds.lpData = ( LPVOID )sendData;
//送受信ウィンドウハンドル取得
sendWinClass = ::FindWindow(_T("SFiceGuiSim"), NULL);
recvWinClass = ::FindWindow(_T("NCCEAnalysisTool"), NULL);
if ( ( sendWinClass == NULL ) || ( recvWinClass == NULL ) ) {
  delete sendData;
  return FALSE;
}
wParam = (WPARAM)sendWinClass;  //送信側のウィンドウハンドル設定
lParam = (LPARAM)&cds;    //送信するデータ設定

//メッセージ送信
::SendMessage( recvWinClass, WM_COPYDATA, wParam, lParam );
delete sendData;
return TRUE;

文字列取り出し側
BOOL CNCE_Analysis_ToolDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
CString strRcvData;
strRcvData = pStr;

//2バイト文字列取得
strRcvData = (TCHAR)(pCopyDataStruct->lpData);

//1バイト文字列取得
//LPCSTR pStr = (LPCSTR)(pCopyDataStruct->lpData);
  
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}

宜しくお願いいたします。


Blue  2011-02-18 23:45:46  No: 72348

>strRcvData = (TCHAR)(pCopyDataStruct->lpData);
キャストを間違えているようです。

strRcvData = (TCHAR*)(pCopyDataStruct->lpData);
もしくは
strRcvData = (LPCTSTR)(pCopyDataStruct->lpData);


あくりる  2011-02-19 02:07:26  No: 72349

お世話になります。

Blueさん有難う御座います。
御指摘された方法では意図した文字列を取得できませんでした。

送信する側で
TCHAR* sendData = new TCHAR[strSendData.GetLength() + 1];
_tcscpy_s( sendData, strSendData.GetLength() + 1, strSendData );
cds.cbData = strSendData.GetLength() + 1;

を下記に変更。
TCHAR* sendData = new TCHAR[(strSendData.GetLength() + 1) * 2];
_tcscpy_s( sendData, (strSendData.GetLength() + 1) * 2,strSendData );
cds.cbData = (strSendData.GetLength() + 1)*2;

文字列取り出し側を以下にすると意図した文字列が取得できます。
strRcvData = (LPCWSTR)(pCopyDataStruct->lpData);

でも理由が分からないです。


maru  2011-02-19 03:00:44  No: 72350

> でも理由が分からないです。
ユニコード文字列だとGetLength()がバイト長ではなく文字列長を返すからではないですか?
CString strSendData;
strSendData = _T( "テストデータ" );
size_t size = strSendData.strSendData();
で size_ は6でした。

そうだとすると
TCHAR* sendData = new TCHAR[strSendData.GetLength() + 1];
_tcscpy_s( sendData, strSendData.GetLength() + 1, strSendData );
は変更する必要がなく、変更するのは
cds.cbData = strSendData.GetLength() + 1;
だけですね。

#そういうことではなくて?


あくりる  2011-02-19 03:41:09  No: 72351

お世話になります。

maru さんのおっしゃるとうりです。

cds.cbData = (strSendData.GetLength() + 1)*2;
にするだけでした。

有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加