티스토리 뷰
DDE (Dynamic Data Exchange)
윈도우즈3.1 부터 지원, Win32환경에서는 어울리지 않으며 다른 IPC로 대체 가능하다.
메시지는 프로세스 간의 통신의 가장 기본적이고 쉬운 방법이나 전달할 수 있는 파라미터가 wParam, lParam 을 다 더해도 64bit 밖에 되지 않기 때문에 크기가 큰 데이터는 전달할 수 없는 단점이 있다. 이에 반해 DDE는 메시지 파라미터를 통해 대용량 데이터를 전달하기 위한 규약이며 내부적으로는 글로벌 아톰(ATOM)과 공유 메모리에 의해 구현된다.
DDE대화는 응용 프로그램간에 이루워 지지만 대화를 하는 기본 주체는 윈도우이다. 응용프로그램은 복수의 대화에 참여할 수도 있는데 서버이면서 동시에 클라이언트가 될 수도 있다. 이때 각 대화마다 별도의 윈도우를 생성해야 한다. 한 윈도우가 2개의 대화를 동시에 진행할 수는 없다. 왜냐하면 DDE는 메시지 기반의 프로토콜이며 메시지는 WndProc으로 보내지고 윈도우 당 WndProc는 하나밖에 없기 때문이다. 그래서 응용 프로그램은 1:1 대화라면 메인 윈도우가 직접 대화를 관장하지만 N:N 대화인 경우는 DDE 대화를 위한 별도의 숨겨진 윈도우를 만들어야 한다. 또는 윈도우즈2000 부터 지원하는 메시지 전용의 윈도우를 만들어 사용할 수 도 있다. (이건 뭐지?)
DDE를 통해 교환되는 데이터는 어플리케이션, 토픽, 아이템이라는 3가지 계층으로 분류되는데 이를 DDE 3요소라고 한다. 어플리케이션, 토픽은 DDE 대화를 구분하는 일종의 ID이며 대화 시작시 이 두가지 요소를 서로 교환함으로써 대화가 성립된다.
어플리케이션 : 주로 서버 응용 프로그램의 이름을 사용한다.
토픽 : 대화 중에 전달 대상이 되는 데이터의 종류를 지정하며 파일 기반의 프로세스인 경우 파일의 이름이 토픽명으로 많이 사용된다.
예를들어 엑셀이 워드와 재고량 데이터 대화를 하고 있고 동시에 파워포인트와 주식 정보 대화를 하고 있다고 하자. 이때 재고량 대화는 Excel-Jaego 라는 어플리케이션-토픽ID를 가지며 주식 대화는 Excel-Jusik ID를 가지게 될 것이다. 대화 ID가 2개의 요소로 되어 있는 이유는 하나의 응용프로그램이 복수 개의 대화에 참여할 수 있기 때문이다. 어플리케이션명과 토픽명은 대화의 ID 이기 때문에 고유해야 하며 대화 중에는 변경될 수 없다.
아이템은 대화중에 전달될 구체적인 교환 대상 정보를 카리킨다. 주식 대화의 경우라면 어떤 종목에 대한 데이터를 요청하는지를 지정하며, 재고량 대화라면 어떤 품목에 대한 재고량인지를 지정할 것이다. 예를들어 아이템 명이 HanTong이라면 한통의 프리텔의 주식 데이터를 묻는것이고 SKTel이라면 SK텔레콤의 주식 데이터를 묻는것이다.
DDE 를 통해 실제로 전돨되는 데이터는 클립보드 포맷을 사용한다. CF_TEXT, CF_BITMAP 등의 표준 클립보드 포맷을 사용할 수도 있고, 등록한 포맷을 사용할 수도 있다. 임의의 데이터 포맷인 경우 클립보드 포맷을 먼저 등록하고 교환할 수 있으므로 실제 DDE를 통해 교환할 수 있는 데이터 포맷에는 제한이 없는 셈이다.
DDE 메시지
DDE는 메시지 기반의 프로토콜이며 9개의 메시지가 DDE 대화의 주된 수단이다. 서버와 클라이언트는 적절한 때에 적절한 메시지를 적절한 방법으로 서로 주고 받으며 끊임없이 대화를 계속해 나간다. DDE에 관련된 메시지는 모두 'WM_DDE_'로 시작한다.
메시지 |
설명 |
WM_DDE_INIATE |
대화를 시작하자는 요청 메시지 |
WM_DDE_ACK |
대화 요청이나 데이터 전송등에 대한 승인/거부 메시지 |
WM_DDE_REQUEST |
클라이언트가 서버에게 데이터를 요청한다. |
WM_DDE_DATA |
서버가 클라이언트에게 데이터를 보낸다. |
WM_DDE_POKE |
클라이언트가 서버에게 데이터를 보낸다. |
WM_DDE_TERMINATE |
대화를 종료한다. |
WM_DDE_ADVISE |
영구적인 데이터의 링크를 만든다. |
WM_DDE_UNADVISE |
데이터 링크를 해제한다. |
WM_DDE_EXECUTE |
서버에게 명령 문자열을 보낸다. |
WM_DDE_INITATE 메시지와 WM_DDE_INITATE메시지에 대한 응답으로 보내지는 WM_DDE_ACK 메시지는 반드시 SendMessage로 보내야하며 나머지 메시지는 모두 PostMessage로 보내야 하는데 이 또한 약속이므로 반드시 지켜야 한다.
각 메시지의 wParam은 모두 메시지를 보내는 윈도우 핸들이며 lParam은 메시지 마다 의미가 다르다. lParam에 어떤 데이터를 어떠헥 넣어 보내는가가 DDE의 핵심 사항이며 DDE란 바로 이 약속의 집합이다.
(