2010-03-05 47 views
1

친구가 저에게 정말로 며칠 동안 직면하고있는 문제에 대해 큰 고뇌를 안겨주고 있습니다 ... 간단합니다 ... 변수 CString 테스트가있는 경우 예를 들어 둘 이상의 대화 상자 사이에서 통신하고 싶습니다. .이 테스트 변수를 대화 상자/클래스 (각 대화 상자가 별도의 클래스를 가짐을 고려하여)로 사용하기를 원합니다 ... 많은 방법을 시도했지만 모든 것이 실패했습니다 ..이 WM_COPYDATA 메서드를 사용해 보았습니다 ... 지금도 무엇을 달성하지 못하고 있습니까? 내가하고 싶었던 ...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 클래스에서 데이터를 수신하지 ...

답변

0

필자는 WinProc.Instead를 사용하지 않고 Dialog11 클래스의 일반 함수 (CopyData)를 작성하고 CCustomDialog1 클래스의 모덜리스 대화 상자를 생성하고 해당 함수 (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.In 및 SendMessage 전 COPYDATASTRUCT 대신 구조체를 전달했습니다. 2. Dialog1 창을 호출하기 전에 FindWindow를 호출했습니다. 3. 사용 된 functi WinProc 함수를 사용하여 메시지를 받는다.그 다음을 피하고 적절한 창 핸들을 전달 4.Didnt 정상적인 기능 를 사용 ... 모든 위는 ... 밥 무어에 의해 수정 된 신용 replyin Bob..I을 위해 .... 그에게

2

귀하의 CString을이 구조체에있을 수 있습니다 ... 이것 좀 도와주세요,하지만 메모리가 힙에 할당 된 저장합니다. 당신은 여기에 low-tech가 필요합니다 : ShareMessage 구조체에 wchar (또는 char 또는 TCHAR)를 배열에 배치하고 문자열 내용을 해당 배열에 복사하십시오. 수신자 코드에서 wchar 배열의 문자열을 읽습니다. 아, 그리고 COPYDATASTRUCT가 아니라 구조체의 주소를 보내고 다른 대화 상자가 아닌 자신에게 보냈습니다. 또한

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

, 당신이 있는지를 FindWindow 호출이

을 작동하는이 같은 및 SendMessage 호출을 수정? 그 학급 이름은 나에게 매우 의심스러운 것처럼 보입니다. 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 상대로받은 메시지 번호를 테스트하는 것을 의미합니다 가정합니다. 위의 내 대답에 추가

+0

thnx를 진행하고 있습니다 ur 도움을 주셔서 감사합니다. 난 .. 그게 여전히 .. 스위치 (pData -> dwData) 여전히 0.do U는 anythere 메서드를 알고 동일 ... – kiddo

+0

당신은 SendMessage 호출에 오류가 통지하지 않았다 . 나는 이것을 보여주기 위해 나의 답장을 편집했다. –

+0

아니 밥, 여전히 그 같은 오류 ... 윈도우 핸들이나 메시지 수신에 문제가있는 것을 발견합니까? 왜냐하면 Dialog1 클래스의 pData-> dwData는 여전히 0 이상입니다. 메시지 보내기 hwnd (즉, HWND hwnd = FindWindow (L "Dialog1", L "Test"))는 NULL을 말합니다 ... 괜찮을 것입니다 .. – kiddo

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

을받을 것입니다하지만 다른 기본적인 질문은 기본적인 메시지는 매우 이상한 것 같다 처리 할 수 ​​WindowProc를 오버라이드 (override), MFC 응용 프로그램에서 ... 여기에있다.

+0

흠 .. 그랬어. memcpy에서 문제가 생겼어. jus giv, 나 min .. i vl. 가능하다면 스크린 샷을 보여라. – kiddo

+0

밥. 메시지 ... 조건 (메시지 == WN_COPYDATA) 실패 ... 그 데이터를 보낼 수 ...하지만 내가 실제로 디버거에서 본 CCopyDialogdlg의 구조 (값을 보유하고 있지만) Dialog1 클래스 구조 .. 그래서 내가 말했듯이 FindWindow ....와 문제가되어야한다. – kiddo

+0

나는 (골프를 치기 위해) 지금 일을해야한다. 오늘이나 월요일에 다시 시도하겠습니다. –