노무현 전 대통령 서거 추모글 남기기

다른 프로그램과 메세지를 주고 받는 방법으로는 간단하게 2가지
방법이 있습니다.
하나는 RegisterWindowMessage 함수를 사용하여 메세지를 등록하는
방법이고 또 하나는 공유 메모리를 사용하여 메모리를 공유하는
방법입니다.

위의 두가지 방법에 대해서 간단하게 설명드리면 다음과 같습니다.

먼저 RegisterWindowMessage 함수를 사용하는 경우는

아래와 같이 메세지를 등록합니다.

UINT nRegMsg = RegisterWindowMessage("My Message");
여기서 입력으로 들어가는 "My Message" 라는 문자열은 메세지를 서로 주고
받기로 한 프로그램간에 서로 약속한 문자열입니다.
이 함수는 메세지를 송신하는쪽이나, 메세지를 수신하는 쪽이나 모두
수행해야 합니다.

메세지가 등록되어 송수신 준비가 되면 SendMessage 또는 PostMessage 함수로
메세지를 전송하면 됩니다.
이때 메세지가 다른 프로그램으로 전달이 되게 하려면
SendMessage 또는 PostMessage함수의 첫번째 입력 인수로 반드시 HWND_BROADCAST를
지정해야 합니다. 그렇지 않으면 다른 프로그램으로 메세지가 전송되지 않습니다.
이때 wParam, lParam을 이용해서 각각 2Byte와 4Byte의 추가적인 정보를 전달
할 수 있습니다.

즉 ::PostMessage(HWND_BROADCAST, nRegMsg, (WPARAM)m_hWnd, (LPARAM)0);
이런식으로 사용하면 됩니다.

메세지를 수신하려는 쪽은 다음의 코드를 추가하면 됩니다.

즉 RegisterWindowMessage로 등록된 메시지를 받을때는
ON_REGISTERED_MESSAGE 매크로를 사용합니다.

즉 ON_REGISTERED_MESSAGE(nRegMsg, OnMessageFunc)
이런 식으로 메세지 수신을 처리하는 함수를 등록해 줍니다.
그리고 이 처리함수에서 메세지 수신을 처리하면 됩니다.

메세지 처리 함수는 다음과 같은 형식을 가집니다.

LRESULT MyClass::OnMessageFunc(WPARAM wParam, LPARAM lParam)
{
// 작업 코드
return 0;
}

그런데 만일 4Byte 이상의 데이터를 전송하려면 어떻게 해야 할까요??
구조체에 정보를 담거나, 메모리를 할당해서 여기에 데이터를 저장한 후
메포리 번지의 포인터를 전달하는 경우가 대부분일테지만, 이 방법은
단일 프로그램에서만 사용이 가능합니다.

즉 위의 방법으로는 문자열이나 기타 대량의 정보를 전송하는데는
문제가 있습니다.

대량의 정보를 서로 공유하려면 메모리 맵 파일을 이용합니다.
즉 공유 메모리를 이용하는 방법을 사용합니다.

메모리 맵 파일은 파일이 아닙니다. 파일처럼 취급되는 메모리의 일종이라고
보시면 됩니다.

기본적인 방법은 CreateFileMapping 함수를 사용하여 메모리 맵 파일을 생성하고
MapViewOfFile 함수를 호출하여 메모리 포인터를 얻어 이 포인터를 일반
포인터처럼 사용하시면 됩니다.

CreateFileMapping 에 대한 설명은 여기서는 모두 하기가 어렵고
Visual C++ 도움말이나 MSDN CD에서 도움말을 참조하시기 바랍니다.(죄송..)

그럼 간단하게 소스를 보면 다음과 같습니다.

LPVOID m_pViewOfFile = NULL;
HANDLE m_hFileMapping = 0;

m_hFileMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, // system paging file
NULL, // security attributes
PAGE_READWRITE, // protection
0, // high-order DWORD of size
dwMemoryFileSize*sizeof(TCHAR), // low-order DWORD of size
sMemoryFileName); // name

if (!m_hFileMapping )
{
MessageBox(_T("Creating of file mapping failed"));
}
else
{
m_pViewOfFile = MapViewOfFile(
m_hFileMapping, // handle to file-mapping object
FILE_MAP_ALL_ACCESS, // desired access
0,
0,
0); // map all file

if (! m_pViewOfFile )
{
MessageBox(_T("MapViewOfFile failed"));
}

// Now we have m_pViewOfFile memory block which is common for
// all instances of this program
}
}

이제 m_pViewOfFile 변수를 자신이 원하는 형태로 캐스팅하여
사용할 수 있습니다.

메세지를 전송하는 프로그램은 이렇게 메모리를 ACCESS 한다음 여기에
데이터를 기록하면 됩니다.

메세지를 수신하는 프로그램에서는 OpenFileMapping함수를 사용하여
메모리 맵 파일을 오픈하고 MapViewOfFile 함수로 메모리 포인터를 얻어서
수신한 데이터를 사용할 수 있습니다.

이런식으로 서로 다른 프로그램이나 프로세스간에 메세지나 메모리를
공유할 수 있습니다.

[출처] RegisterWindowMessage|작성자 형기

Posted by Kelly Cook
,