WM_COPYDATAメッセージでポインタの送受信方法

[戻る]
ゴン太 [E-Mail] 2001/11/15(木) 18:03:09
度々、お邪魔しています。 ゴン太です。
以下の構造体のポインタ送受について、質問します。
構造体の受信側の *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);        // ???????
    }                             // ???????

toru [E-Mail] [HomePage] 2001/11/15(木) 18:30:36
---------------------------------
StrTest sTest;
↓
StrTest* pTest;
---------------------------------
char mess[32];
↓
char mess[32] = "";
---------------------------------
for (i = 0; i < ln; i++) {    // ???????
   mess[i] = *(p + i);        // ???????
}                             // ???????
↓
strcpy(mess,p);
---------------------------------

こんなもんで...

ゴン太 2001/11/15(木) 19:00:27
StrTest sTest;
↓
StrTest* pTest;

ゴン太 [E-Mail] 2001/11/15(木) 19:04:06
toruさん、ありがとうございます。
---------------------------------
StrTest sTest;
↓
StrTest* pTest;
---------------------------------
この部分は、私の記述ミスでした。
この通りにしております。
その他の箇所をかえたのですが、結果は同様でした。
messの表示方法がおかしいのでしょうか?

宜しく、お願いします。

kazuma 2001/11/15(木) 19:06:35
これはプロセス間でデータをやり取りするのが目的ですよね?
とするとこれではうまくいきません。

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.長さがどれくらいになるか分からない文字列を複数送るなら、
別の方法を考えるということで。

YuO [E-Mail] 2001/11/16(金) 05:00:50
力技で良ければ,送信元ウィンドウハンドルから送信元のPIDを取得して,
PIDをもとにプロセスハンドルを開き,ReadProcessMemoryで取得する方法もあります。

まぁ,構造体中にポインタを含めいないのが一番の解決方法ですが。

ゴン太 [E-Mail] 2001/11/16(金) 09:39:29
[[解決]]
toruさん、kazumaさん、YuOさん、ありがとうございます。
いくらやっても出来なので、途方にくれておりました。

> The data being passed must not contain pointers or other references to objects not accessible to
> the application receiving the data. 

これが、分かって視野が開けた気分です。
実体で取り扱います。 ありがとうございました。

古いスレッドには追加発言できません。