1

友達は、私が数日間直面している問題について本当に頭が痛いです...簡単です...たとえば、変数CStringテストがある場合、2つ以上のダイアログボックス間で通信したい..私このテスト変数をダイアログ/クラスで共通にしたい(各ダイアログが別々のクラスを持つことを考慮して)...多くのメソッドを試しましたが、すべて失敗しました..最後に、このWM_COPYDATAメソッドを試しました...今でも、私が望んでいたものを達成していませんする...

Sender Class:

#define ORGININFO 1

typedef struct ShareMessage
{
    CString mydata;
    int myValue;
}MYDATA;

void CCopyDataDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    MYDATA myData;
    COPYDATASTRUCT cData;

    myData.mydata.SetString(L"Rakesh");

    cData.dwData = ORGININFO;
    cData.cbData = sizeof(myData);
    cData.lpData = &myData;

    HWND hwnd  = (HWND)FindWindow(L"Dialog1",L"Test");



    SendMessageA(m_hWnd,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)(LPVOID)&myData);


    Dialog1 dlg;
    dlg.DoModal();

}

レシーバー クラス:

#define iMessage 1

typedef struct MyDatas
{
    CString myData;
    int myint;
}DATA;
PCOPYDATASTRUCT pData;


LRESULT Dialog1::WindowProc(UINT message,WPARAM wParam,LPARAM lparam)
{

    if(WM_COPYDATA != NULL)
        pData = (PCOPYDATASTRUCT)lparam;
        switch(pData->dwData)
        {
        case iMessage:
            MessageBoxA((HWND)AfxGetInstanceHandle(),(LPCSTR)(LPCTSTR)((DATA*)(pData->lpData))->myData,(LPCSTR)L"Test",MB_OK);

        }
    return 0;
}

上記で、私がやっている間違いが何であるかわかりませんが、CCopyDialog クラスからデータを受信して​​いません...これで私を助けてください...

4

3 に答える 3

2

CString は構造体にある可能性がありますが、それを格納するためのメモリはヒープに割り当てられます。ここではローテクにならなければなりません: wchar (または、必要に応じて char または TCHAR) 配列を ShareMessage 構造体に配置し、文字列の内容をその配列にコピーします。レシーバー コードで、wchar 配列から文字列を読み取ります。ああ、COPYDATASTRUCT ではなく、自分の構造体のアドレスを送信し、他のダイアログではなく自分自身に送信しました。SendMessage 呼び出しを次のように変更します。

SendMessage (hWnd,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)(LPVOID)&cData);

また、FindWindow 呼び出しが機能していると確信していますか? そのクラス名は私には非常に疑わしいように見えます。NULL を使用し、ウィンドウ タイトルに依存することをお勧めします。MFCダイアログには固定のクラス名があるという漠然とした記憶があります。

その後、コードが機能するはずです。

例えば:

typedef struct ShareMessage
{
    wchar szMyString [100];
    int myValue;
}MYDATA;

void CCopyDataDlg::OnBnClickedOk()
{
   MYDATA myData;
   COPYDATASTRUCT cData;
   ZeroMemory (&myData, sizeof(myData);

   wcscpy (myData.szMyString, (L"Rakesh"));

   cData.dwData = ORGININFO;
   cData.cbData = sizeof(myData);
   cData.lpData = &myData;
   ...

私はそのコードをテストしていません。それは私の頭の上から外れています。定数文字列に L 修飾子を使用したため、wchar と想定しました。

さらに、レシーバー コードには次の行があります。

if (WM_COPYDATA != NULL)

これは意味がありません。定数 WM_COPYDATA に対して受信したメッセージ番号をテストするつもりだったと思います。

于 2010-03-05T09:28:55.023 に答える
0

上記の私の答えに加えて、これは受信コードです

LRESULT Dialog1::WindowProc(UINT message,WPARAM wParam,LPARAM lparam)
{
   CString csPassedString;
   PCOPYDATASTRUCT pData;
   MYDATA myStuff;

   if (message == WM_COPYDATA)
   {
      pData = (PCOPYDATASTRUCT)lparam;
      if (pData)
      {
         memcpy (&myStuff, pData->lpData, sizeof(myData));
         csPassedString = myStuff.szMyString;
         switch(pData->dwData)
         {
           case iMessage:
              MessageBox (csPassedString,
                          L"Test",
                          MB_OK);
....

しかし、ここでもう 1 つ基本的な質問があります... MFC アプリケーションでは、基本的なメッセージを処理するためだけに WindowProc をオーバーライドするのは非常に奇妙に思えます。

于 2010-03-05T11:26:14.787 に答える
0

私はWinProcの使用を避けました..その代わりに、クラスDialog11に通常の関数(CopyData)を書きました..クラスCCopyDialog1にモードレスダイアログを作成しました..そしてその関数(CopyData)を呼び出しました..動作しました..以下のコード...

//CCopyDialog Class(sender)
void CCopyDataDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    Dialog1* dialog1 = new Dialog1();
    dialog1->Create(IDD_DIALOG1,0);
    dialog1->ShowWindow(SW_SHOW);
    ZeroMemory(&myData,sizeof(myData));
    wcscpy(myData.mydata,(L"Rakesh"));

    cData.dwData = ORGININFO;
    cData.cbData = sizeof(myData);
    cData.lpData = &myData;

       HWND rs = ::FindWindow(NULL,L"Rakesh");

    dialog1->CopyData(WM_COPYDATA,(WPARAM)rs,(LPARAM)&cData);


}


Dialog1 class(receiver)
LRESULT Dialog1::CopyData(UINT message,WPARAM wParam,LPARAM lparam)
{
    if(message == WM_COPYDATA)
    {
        pData = (PCOPYDATASTRUCT)lparam;
        wchar_t tes[50];
        memcpy(tes,((DATA*)(pData->lpData))->myData,sizeof(DATA));

    }
    else
    {
        return FALSE;
    }

    return 0;
}

基本的に、以前のコード(質問のコード)と比較すると...多くの違い/間違いがあります..

1. sendmessage で、COPYDATASTRUCT の代わりに構造体を渡しました.. 2.Dialog1 ウィンドウを呼び出す前に FindWindow を呼び出しました..それと通常の関数を使用しました

于 2010-03-06T04:38:40.190 に答える