お世話になります。
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);
}
宜しくお願いいたします。
>strRcvData = (TCHAR)(pCopyDataStruct->lpData);
キャストを間違えているようです。
strRcvData = (TCHAR*)(pCopyDataStruct->lpData);
もしくは
strRcvData = (LPCTSTR)(pCopyDataStruct->lpData);
お世話になります。
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);
でも理由が分からないです。
> でも理由が分からないです。
ユニコード文字列だと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;
だけですね。
#そういうことではなくて?
お世話になります。
maru さんのおっしゃるとうりです。
cds.cbData = (strSendData.GetLength() + 1)*2;
にするだけでした。
有難う御座いました。
ツイート | ![]() |