度々、お邪魔しています。 ゴン太です。
以下の構造体のポインタ送受について、質問します。
構造体の受信側の *Msg の取り出し方がわかりません。
それとも、送信側がまずいのでしょうか???
どなたか、宜しく御教授願います。
// ---------------------------- 送信側 -----------------------------------
typedef struc tagStrTest{
  char *Msg;
    DWORD MsgLen;
}StrTest;
StrTest sTest
char moji[32];
strcpy(moji,ABCDEFG);
sTest.Msg = moji;
sTest.MsgLen = strlen(moji);
cds.dwData = 0x2000;
cds.cbData = sizeof(sTest);		//データサイズを入れます
cds.lpData = &sTest;			//データのポインタを入れます
LRESULT lOK = pTargetWnd->SendMessage(WM_COPYDATA, myhWnd, (LPARAM)&cds);
// ------------------- 受信側 ----------------------
typedef struc tagStrTest{
	char *Msg;
	DWORD MsgLen;
}StrTest;
BOOL CMyView::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
    int i, ln;
    StrTest sTest;
    char *p, mess[32];
  sTest = (StrTest *)pCopyDataStruct->lpData;
    ln = sTest->MsgLen;   // これは、うまく取り出せます。
  // ここの、ポインタの文字列の取り出し方がわかりません
    p = (char *)sTest->Msg;       // ???????
    for (i = 0; i < ln; i++) {    // ???????
       mess[i] = *(p + i);        // ???????
    }                             // ???????
---------------------------------
StrTest sTest;
↓
StrTest* pTest;
---------------------------------
char mess[32];
↓
char mess[32] = ";
---------------------------------
for (i = 0; i < ln; i++) {    // ???????
   mess[i] = *(p + i);        // ???????
}                             // ???????
↓
strcpy(mess,p);
---------------------------------
こんなもんで...
StrTest sTest;
↓
StrTest* pTest;
toruさん、ありがとうございます。
---------------------------------
StrTest sTest;
↓
StrTest* pTest;
---------------------------------
この部分は、私の記述ミスでした。
この通りにしております。
その他の箇所をかえたのですが、結果は同様でした。
messの表示方法がおかしいのでしょうか?
宜しく、お願いします。
これはプロセス間でデータをやり取りするのが目的ですよね?
とするとこれではうまくいきません。
MSDN の WM_COPYDATA から引用すると、
> The data being passed must not contain pointers or other references to objects not accessible to
> the application receiving the data. 
ということです。
解決策としては、
1.文字列の最大長が決まっている(かつあまり長くない)なら、
typedef struc tagStrTest{
  char Msg[32];
    DWORD MsgLen;
}StrTest;
2.文字列1つだけなら
cds.cbData = strlen(moji)+1;        //データサイズを入れます
cds.lpData = moji;            //データのポインタを入れます
でもいいです。
3.長さがどれくらいになるか分からない文字列を複数送るなら、
別の方法を考えるということで。
力技で良ければ,送信元ウィンドウハンドルから送信元のPIDを取得して,
PIDをもとにプロセスハンドルを開き,ReadProcessMemoryで取得する方法もあります。
まぁ,構造体中にポインタを含めいないのが一番の解決方法ですが。
toruさん、kazumaさん、YuOさん、ありがとうございます。
いくらやっても出来なので、途方にくれておりました。
> The data being passed must not contain pointers or other references to objects not accessible to
> the application receiving the data. 
これが、分かって視野が開けた気分です。
実体で取り扱います。 ありがとうございました。

 
  
  
  
  