WM_COPYDATAメッセージでポインタの送受信方法 – プログラミング – Home

WM_COPYDATAメッセージでポイ...
 
通知
すべてクリア

[解決済] WM_COPYDATAメッセージでポインタの送受信方法


ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 24年前
投稿: 14
Topic starter  

度々、お邪魔しています。 ゴン太です。
以下の構造体のポインタ送受について、質問します。
構造体の受信側の *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
 toru
(@toru)
ゲスト
結合: 24年前
投稿: 48
 

---------------------------------
StrTest sTest;

StrTest* pTest;
---------------------------------
char mess[32];

char mess[32] = ";
---------------------------------
for (i = 0; i < ln; i++) { // ???????
mess[i] = *(p + i); // ???????
} // ???????

strcpy(mess,p);
---------------------------------

こんなもんで...


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 24年前
投稿: 18
 

StrTest sTest;

StrTest* pTest;


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 24年前
投稿: 14
Topic starter  

toruさん、ありがとうございます。
---------------------------------
StrTest sTest;

StrTest* pTest;
---------------------------------
この部分は、私の記述ミスでした。
この通りにしております。
その他の箇所をかえたのですが、結果は同様でした。
messの表示方法がおかしいのでしょうか?

宜しく、お願いします。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

これはプロセス間でデータをやり取りするのが目的ですよね?
とするとこれではうまくいきません。

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
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

力技で良ければ,送信元ウィンドウハンドルから送信元のPIDを取得して,
PIDをもとにプロセスハンドルを開き,ReadProcessMemoryで取得する方法もあります。

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


返信引用
ゴン太
 ゴン太
(@ゴン太)
ゲスト
結合: 24年前
投稿: 14
Topic starter  

toruさん、kazumaさん、YuOさん、ありがとうございます。
いくらやっても出来なので、途方にくれておりました。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました