2010-03-05 7 views
1

Mes amis me font vraiment mal au sujet du problème auquel je suis confronté depuis quelques jours ... C'est simple ... Je veux communiquer entre deux ou plusieurs boîtes de dialogue par exemple s'il y a un test de CString variable. .Je veux que cette variable de test soit commune pour les dialogues/classes (en considérant chaque boîte de dialogue ayant des classes séparées) ... J'ai essayé beaucoup de méthodes, tout a échoué ... en dernier j'ai essayé cette méthode WM_COPYDATA ... même maintenant, je ne réalise pas Je voulais faire ...Problème dans la communication entre deux boîtes de dialogue via 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(); 

} 

récepteur classe:

#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; 
} 

dans ce qui précède, je ne sais pas ce qui est l'erreur Je fais mais il ne reçoit pas les données de la classe CCopyDialog ... S'il vous plaît aidez-moi avec ceci ...

Répondre

0

J'ai évité d'utiliser WinProc..Au lieu de cela j'ai écrit une fonction normale (CopyData) dans la classe Dialog11..Créé une boîte de dialogue non modale dans la classe CCopyDialog1 .. et appelé cette fonction (CopyData) .. Cela a fonctionné. .please vérifier le code ci-dessous ...

//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; 
} 

en fait, par rapport à mon code précédent (code dans ma question) ... theres beaucoup de différence/erreurs ..

1.In le sendmessage i passé la structure à la place de COPYDATASTRUCT .. 2. Appelez FindWindow avant d'appeler la fenêtre Dialog1. 3.Utilisez la fonction sur la fonction WinProc pour recevoir le message .. ce qui était très difficile à faire fonctionner ..alors évité cela et utilisé une fonction normale 4.Didnt passer une poignée de fenêtre appropriée ... ci-dessus tous sont corrigés par Bob Moore ... crédit va à lui ....

2

Votre CString peut être dans la structure, mais la mémoire pour stocker il est allouée sur le tas. Vous devez aller ici à la basse technologie: mettez un tableau wchar (ou char, ou TCHAR en fonction de vos désirs) dans la structure ShareMessage et copiez le contenu de la chaîne dans ce tableau. Dans le code de votre récepteur, lisez la chaîne du tableau wchar. Oh, et vous avez envoyé l'adresse de votre structure, pas le COPYDATASTRUCT, et vous l'avez envoyé, pas l'autre dialogue. modifier l'appel SendMessage comme ceci:

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

Aussi, êtes-vous sûr l'appel FindWindow fonctionne? Ce nom de classe me semble très suspect. Mieux vaut utiliser NULL et s'appuyer sur le titre de la fenêtre. J'ai cette mémoire vague que les boîtes de dialogue MFC ont un nom de classe fixe.

Votre code devrait alors fonctionner.

Par exemple:

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; 
    ... 

Je n'ai pas testé ce code, il est du haut de ma tête. J'ai supposé wchar parce que vous avez utilisé le modificateur L sur votre chaîne constante.

De plus, dans votre code de récepteur que vous avez cette ligne:

if (WM_COPYDATA != NULL) 

qui n'a pas de sens. Je suppose que vous avez voulu tester le numéro de message reçu par rapport à la constante WM_COPYDATA.

+0

thnx pour répondre Bob ..I J'apprécie votre aide .. Je fatigué que .. Il est toujours le même .. le commutateur (pData-> dwData) est toujours 0.do vous connaissez anythere méthodes ... – kiddo

+0

Vous avez une erreur dans l'appel SendMessage je n'ai pas remarqué . J'ai édité ma réponse pour le montrer. –

+0

non Bob, c'est toujours la même erreur ... Trouvez-vous quelque chose de mal dans la poignée de la fenêtre ou dans la réception du message ... parce que dans la classe Dialog1 pData-> dwData est toujours 0.plus sur le dans le message d'envoi le hwnd (c.-à-d. HWND hwnd = FindWindow (L "Dialog1", L "Test")) dit que NULL ... est ce que ça devrait aller .. – kiddo

0

Suite à ma réponse ci-dessus, c'est le code de réception

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); 
.... 

Mais il y a une autre question fondamentale ici ... dans une application MFC, remplaçant la WindowProc juste pour gérer un message de base semble très étrange.

+0

hm..tried it ... problème dans memcpy ... jus giv, moi un min..i vl montrer la capture d'écran si possible – kiddo

+0

bob .. je viens de réaliser que ce n'est pas l'envoi du message ... la condition (message == WN_COPYDATA) échoue ... J'ai dit qu'il est capable d'envoyer les données ... mais ce que j'ai réellement vu dans le débogueur est la structure (qui détient la valeur) du CCopyDialogdlg mais pas la structure de la classe Dialog1 .. comme vous l'avez dit, il devrait être le problème avec FindWindow .... – kiddo

+0

Je dois quitter le travail maintenant (pour jouer au golf). Je vais essayer de le reprendre plus tard aujourd'hui, ou lundi. –