度々、お邪魔しています。 ゴン太です。
以下の構造体のポインタ送受について、質問します。
構造体の受信側の *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.
これが、分かって視野が開けた気分です。
実体で取り扱います。 ありがとうございました。