동적 데이터 교환 정보

Windows는 애플리케이션 간에 데이터를 전송하는 몇 가지 방법을 제공합니다. 한 가지 방법은 DDE(동적 데이터 교환) 프로토콜을 사용하는 것입니다. DDE 프로토콜은 메시지 및 지침 집합입니다. 데이터를 공유하고 공유 메모리를 사용하여 애플리케이션 간에 데이터를 교환하는 애플리케이션 간에 메시지를 보냅니다. 애플리케이션은 일회성 데이터 전송 및 새 데이터를 사용할 수 있게 되면 애플리케이션이 서로 업데이트를 보내는 지속적인 교환에 DDE 프로토콜을 사용할 수 있습니다.

Windows는 DDEML(동적 데이터 교환 관리 라이브러리)도 지원합니다. DDEML은 애플리케이션이 데이터를 공유하는 데 사용할 수 있는 DLL(동적 연결 라이브러리)입니다. DDEML은 애플리케이션에 DDE 기능을 추가하는 작업을 간소화하는 함수 및 메시지를 제공합니다. 애플리케이션은 DDE 메시지를 직접 전송, 게시 및 처리하는 대신 DDEML 함수를 사용하여 DDE 대화를 관리합니다. (DDE 대화는 클라이언트와 서버 애플리케이션 간의 상호 작용입니다.)

DDEML은 DDE 애플리케이션이 공유하는 문자열 및 데이터를 관리하기 위한 기능도 제공합니다. DDE 애플리케이션은 공유 메모리 개체에 원자 및 포인터를 사용하는 대신 문자열을 식별하는 문자열 핸들과 메모리 개체를 식별하는 데이터 핸들을 만들고 교환합니다. 또한 DDEML을 사용하면 서버 애플리케이션이 지원하는 서비스 이름을 등록할 수 있습니다. 이름은 시스템의 다른 애플리케이션으로 브로드캐스트되며, 이름을 사용하여 서버에 연결할 수 있습니다. 또한 DDEML은 DDE 애플리케이션이 일관된 방식으로 DDE 프로토콜을 구현하도록 강제하여 DDE 애플리케이션 간의 호환성을 보장합니다.

메시지 기반 DDE 프로토콜을 사용하는 기존 애플리케이션은 DDEML을 사용하는 애플리케이션과 완전히 호환됩니다. 즉, 메시지 기반 DDE를 사용하는 애플리케이션은 DDEML을 사용하는 애플리케이션과 대화를 설정하고 트랜잭션을 수행할 수 있습니다. DDEML의 많은 장점 때문에 새 애플리케이션은 DDE 메시지 대신 사용해야 합니다. DDEML의 API 요소를 사용하려면 원본 파일에 DDEML 헤더 파일을 포함하고, DDEML 라이브러리와 연결하고, DDEML 동적 링크 라이브러리가 시스템의 검색 경로에 있는지 확인해야 합니다.

이 섹션에서 설명하는 항목은 다음과 같습니다.

동적 데이터 교환 프로토콜

Windows에는 메시지 기반 아키텍처가 있으므로 메시지를 전달하는 것이 애플리케이션 간에 정보를 자동으로 전송하는 가장 적절한 방법입니다. 그러나 메시지에는 데이터 전달을 위한 두 개의 매개 변수(wParamlParam)만 포함됩니다. 따라서 이러한 매개 변수는 몇 단어 이상의 정보가 애플리케이션 간에 전달되는 경우 다른 데이터 조각을 간접적으로 참조해야 합니다. DDE 프로토콜은 애플리케이션이 wParamlParam 매개 변수를 사용하여 글로벌 원자 및 공유 메모리 핸들을 통해 더 큰 데이터를 전달하는 방법을 정확하게 정의합니다. DDE 프로토콜에는 전역 원자 및 공유 메모리 개체를 할당하고 삭제하기 위한 특정 규칙이 있습니다.

전역 원자는 문자열에 대한 참조입니다. DDE 프로토콜에서 원자는 데이터를 교환하는 애플리케이션, 교환되는 데이터의 특성 및 데이터 항목 자체를 식별합니다. 원자에 대한 자세한 내용은 원자 정보를 참조하세요.

Windows 동적 데이터 교환에 사용

DDE는 지속적인 사용자 상호 작용이 필요하지 않은 데이터 교환에 가장 적합합니다. 일반적으로 애플리케이션은 사용자가 데이터를 교환하는 애플리케이션 간의 링크를 설정하는 메서드를 제공합니다. 그러나 해당 링크가 설정되면 애플리케이션은 추가 사용자 개입 없이 데이터를 교환합니다.

DDE를 사용하여 광범위한 애플리케이션 기능을 구현할 수 있습니다. 예를 들면 다음과 같습니다.

  • 주식 시장 업데이트, 과학 기기 또는 프로세스 제어와 같은 실시간 데이터에 연결합니다.
  • 그래픽 애플리케이션에서 생성된 차트를 포함하는 단어 처리 문서와 같은 복합 문서를 만듭니다. DDE를 사용하면 원본 데이터가 변경될 때 차트가 변경되고 나머지 문서는 동일하게 유지됩니다.
  • 데이터베이스에서 기한이 지난 계정에 대해 쿼리하는 스프레드시트와 같이 애플리케이션 간에 데이터 쿼리를 수행합니다.

사용자의 관점에서 동적 데이터 교환

다음 예제에서는 사용자의 관점에서 볼 수 있듯이 두 DDE 애플리케이션이 어떻게 협력할 수 있는지 보여 줍니다.

스프레드시트 사용자는 Microsoft Excel을 사용하여 뉴욕 증권거래소에서 특정 주식의 가격을 추적하려고 합니다. 사용자에게 Quote라는 애플리케이션이 있으며, 이 애플리케이션은 다시 NYSE 데이터에 액세스할 수 있습니다. Excel과 Quote 간의 DDE 대화는 다음과 같이 수행됩니다.

  • 사용자는 데이터 및 특정 관심 항목(NYSE)을 제공할 애플리케이션의 이름(견적)을 제공하여 대화를 시작합니다. 결과 DDE 대화는 특정 주식에 대한 견적을 요청하는 데 사용됩니다.
  • Excel은 현재 시스템에서 실행 중인 모든 DDE 애플리케이션에 애플리케이션 및 토픽 이름을 브로드캐스트합니다. QUOTE가 응답하여 NYSE 토픽에 대한 Excel과의 대화를 설정합니다.
  • 그러면 사용자는 특정 주식 견적이 변경될 때마다 스프레드시트를 자동으로 업데이트할 것을 요청하는 스프레드시트 수식을 셀에 만들 수 있습니다. 예를 들어 사용자는 다음 Excel 수식을 지정하여 ZAXX 주식의 판매 가격에 변경이 발생할 때마다 자동 업데이트를 요청할 수 있습니다. ='Quote'|' 뉴욕증권거래소'! ZAXX
  • 사용자는 언제든지 ZAXX 주식 견적의 자동 업데이트를 종료할 수 있습니다. 별도로 설정된 다른 데이터 링크(예: 다른 주식에 대한 견적)는 여전히 동일한 NYSE 대화에서 활성 상태로 유지됩니다.
  • 사용자는 또한 NYSE 토픽에서 Excel과 Quote 간의 전체 대화를 종료할 수 있으므로 새 대화를 시작하지 않고는 해당 항목에 대한 특정 데이터 링크를 설정할 수 없습니다.

동적 데이터 교환 개념

다음 섹션에서는 동적 데이터 교환을 이해하는 데 핵심적인 중요한 개념과 용어에 대해 설명합니다.

클라이언트, 서버 및 대화

DDE에 참여하는 두 애플리케이션은 DDE 대화에 참여했다고 합니다. 대화를 시작하는 애플리케이션은 DDE 클라이언트 애플리케이션입니다. 클라이언트에 응답하는 애플리케이션은 DDE 서버 애플리케이션입니다. 애플리케이션은 동시에 여러 대화에 참여할 수 있으며, 일부 대화에서는 클라이언트 역할을 하고 다른 대화에서는 서버 역할을 할 수 있습니다.

DDE 대화는 참여하는 각 애플리케이션에 대해 하나씩 두 창 간에 이루어집니다. 창은 애플리케이션의 기본 창, MDI(다중 문서 인터페이스) 애플리케이션에서와 같이 특정 문서와 연결된 창 또는 DDE 메시지를 처리하는 데만 사용할 수 있는 숨겨진(보이지 않는) 창일 수 있습니다.

DDE 대화는 대화에 참여하는 창에 대한 핸들 쌍으로 식별되므로 다른 창과 둘 이상의 대화에 참여하는 창은 없어야 합니다. 클라이언트 애플리케이션 또는 서버 애플리케이션은 특정 서버 또는 클라이언트 애플리케이션과의 각 대화에 대해 다른 창을 제공해야 합니다.

애플리케이션은 각 대화에 대해 숨겨진 창을 만들어 클라이언트 및 서버 창 쌍이 둘 이상의 대화에 관여하지 않도록 할 수 있습니다. 이 창의 유일한 목적은 DDE 메시지를 처리하는 것입니다.

애플리케이션, 토픽 및 항목 이름

DDE 프로토콜은 애플리케이션, 토픽 및 항목 이름의 3단계 계층 구조를 사용하여 클라이언트와 서버 간에 전달되는 데이터 단위를 식별합니다.

각 DDE 대화는 애플리케이션 이름 및 토픽으로 고유하게 정의됩니다. DDE 대화가 시작될 때 클라이언트와 서버는 애플리케이션 이름 및 토픽을 결정합니다. 애플리케이션 이름은 일반적으로 서버 애플리케이션의 이름입니다. 예를 들어 Excel이 대화에서 서버 역할을 하는 경우 애플리케이션 이름은 Excel입니다.

DDE 항목은 대화 중에 여러 데이터 항목이 "논의"(교환)될 수 있는 데이터의 일반적인 분류입니다. 파일 기반 문서에서 작동하는 애플리케이션의 경우 토픽은 일반적으로 파일 이름입니다. 다른 애플리케이션의 경우 토픽은 애플리케이션별 이름입니다.

클라이언트 창과 서버 창은 DDE 대화를 함께 식별하므로 대화를 정의하는 애플리케이션 이름과 토픽은 대화 과정에서 변경할 수 없습니다.

DDE 데이터 항목은 애플리케이션 간에 교환되는 대화 항목과 관련된 정보입니다. 데이터 항목의 값은 서버에서 클라이언트로 또는 클라이언트에서 서버로 전달할 수 있습니다. 데이터는 표준 클립보드 형식 또는 등록된 클립보드 형식으로 전달할 수 있습니다. Link라는 특수한 등록된 형식은 DDE 대화의 항목을 식별합니다. 클립보드 형식에 대한 자세한 내용은 클립보드를 참조하세요.

시스템 항목

애플리케이션은 항상 시스템 토픽을 지원해야 합니다. 이 항목에서는 다른 애플리케이션에 일반적으로 관심을 가질 수 있는 정보에 대한 컨텍스트를 제공합니다.

데이터 항목 값은 CF_TEXT 클립보드 형식으로 렌더링되어야 합니다. 시스템 토픽에 대한 항목 값의 개별 요소는 탭 문자로 구분되어야 합니다. 다음 표에서는 시스템 항목에 대한 몇 가지 항목을 제안합니다.

항목 Description
형식 애플리케이션이 렌더링할 수 있는 클립보드 형식의 탭으로 구분된 목록입니다. 일반적으로 CF_ 형식은 제거된 이름의 "CF_" 부분과 함께 나열됩니다(예: CF_TEXT "TEXT"로 나열됨).
도움말 DDE 서버를 사용하는 방법을 간략하게 설명하는 텍스트입니다.
ReturnMessage 가장 최근에 사용한 WM_DDE_ACK 메시지에 대한 세부 정보 지원 이 항목은 8비트 이상의 애플리케이션별 반환 데이터가 필요한 경우에 유용합니다.
상태 애플리케이션의 현재 상태 나타냅니다. 서버가 이 시스템 토픽 항목에 대한 WM_DDE_REQUEST 메시지를 받으면 적절하게 사용 중 또는 준비됨이 포함된 문자열이 포함된 WM_DDE_DATA 메시지를 게시하여 응답해야 합니다.
SysItems 애플리케이션에서 지원하는 시스템 토픽 항목 목록입니다.
TopicItemList 시스템 토픽 이외의 각 토픽에 대해 TopicItemList를 지원해야 한다는 점을 제외하고 SysItems 항목과 유사합니다. 이렇게 하면 모든 항목에서 지원되는 항목을 검색할 수 있습니다. 항목을 열거할 수 없는 경우 이 항목에는 "TopicItemList"만 포함되어야 합니다.
토픽 현재 애플리케이션에서 지원하는 topics 목록입니다. 이 목록은 순간마다 다를 수 있습니다.

 

DDE 대화가 시작되면 클라이언트는 서버와 하나 이상의 영구 데이터 링크를 설정할 수 있습니다. 데이터 링크는 지정된 데이터 항목의 값이 변경될 때마다 서버가 클라이언트에 알립니다. 데이터 링크는 데이터 링크 또는 DDE 대화 자체가 종료될 때까지 이 알림 프로세스가 계속된다는 점에서 영구적입니다.

영구 DDE 데이터 링크에는 웜 및 핫이라는 두 가지 종류의 영구 DDE 데이터 링크가 있습니다. 웜 데이터 링크에서 서버는 데이터 항목의 값이 변경되었음을 클라이언트에 알리지만 클라이언트가 요청할 때까지 서버는 클라이언트에 데이터 값을 보내지 않습니다. 핫 데이터 링크에서 서버는 변경된 데이터 값을 클라이언트에 즉시 보냅니다.

웜 또는 핫 데이터 링크를 지원하는 애플리케이션은 일반적으로 편집 메뉴에서 링크 복사 또는 붙여넣기 명령을 제공하여 사용자가 애플리케이션 간에 링크를 설정할 수 있도록 합니다.

원자 및 공유 메모리 개체

DDE 메시지의 특정 인수는 전역 원자 또는 공유 메모리 개체입니다. 이러한 인수를 사용하는 애플리케이션은 할당 및 삭제 시기에 대한 명시적 규칙을 따라야 합니다. 모든 경우에 메시지 발신자는 PostMessage 함수 오류와 같은 오류 조건으로 인해 의도한 수신자가 받지 못할 원자 또는 공유 메모리 개체를 삭제해야 합니다.

DDE는 다음 세 가지 용도로 공유 메모리 개체를 사용합니다.

  • 교환할 데이터 항목 값을 전달합니다. WM_DDE_DATA 및 WM_DDE_POKE 메시지에서 hData 매개 변수에서 참조하는 항목 입니다.
  • 메시지에 옵션을 전달합니다. WM_DDE_ADVISE 메시지의hOptions 매개 변수에서 참조하는 항목입니다.
  • 명령 실행 문자열을 수행합니다. 이 항목은 WM_DDE_EXECUTE 메시지의 hCommands 매개 변수와 해당 WM_DDE_ACK 메시지에서 참조하는 항목입니다.

DDE 공유 메모리 개체를 수신하는 애플리케이션은 읽기 전용으로 처리해야 합니다. 애플리케이션은 데이터를 자유롭게 교환하기 위해 개체를 상호 읽기-쓰기 영역으로 사용하면 안됩니다.

DDE 원자와 마찬가지로 애플리케이션은 메모리를 효과적으로 관리하기 위해 공유 메모리 개체를 해제해야 합니다. 또한 애플리케이션은 메모리 개체를 잠그고 잠금을 해제해야 합니다.

동적 데이터 교환 메시지 개요

DDE는 메시지 기반 프로토콜이므로 함수 또는 라이브러리를 사용하지 않습니다. 모든 DDE 트랜잭션은 클라이언트 창과 서버 창 간에 정의된 특정 DDE 메시지를 전달하여 수행됩니다.

9개의 DDE 메시지가 있습니다. 이러한 메시지에 대한 기호 상수는 DDE 헤더 파일에 정의됩니다. 다양한 DDE 메시지에 대한 특정 구조도 이 헤더 파일에 정의됩니다.

다음 표에서는 DDE 메시지를 요약합니다.

메시지 Description
WM_DDE_ACK 메시지 수신 또는 수신 안 을 승인합니다.
WM_DDE_ADVISE 데이터 항목이 변경되면 서버 애플리케이션에 데이터 항목에 대한 업데이트 또는 알림을 제공하도록 요청합니다. 그러면 영구 데이터 링크가 설정됩니다.
WM_DDE_DATA 클라이언트 애플리케이션에 데이터 항목 값을 보냅니다.
WM_DDE_EXECUTE 문자열을 일련의 명령으로 처리해야 하는 서버 애플리케이션에 문자열을 보냅니다.
WM_DDE_INITIATE 클라이언트와 서버 애플리케이션 간의 대화를 시작합니다.
WM_DDE_POKE 데이터 항목 값을 서버 애플리케이션에 보냅니다.
WM_DDE_REQUEST 서버 애플리케이션에 데이터 항목의 값을 제공하도록 요청합니다.
WM_DDE_TERMINATE 대화를 종료합니다.
WM_DDE_UNADVISE 영구 데이터 링크를 종료합니다.

 

애플리케이션은 SendMessage 를 호출하여 WM_DDE_INITIATE 메시지 또는 WM_DDE_INITIATE 대한 응답으로 전송된 WM_DDE_ACK 메시지를 발급합니다. 다른 모든 메시지는 PostMessage에서 전송됩니다. 이러한 호출의 첫 번째 매개 변수는 수신 창에 대한 핸들입니다. 두 번째 매개 변수에는 보낼 메시지가 포함됩니다. 세 번째 매개 변수는 보내는 창을 식별합니다. 네 번째 매개 변수에는 메시지 관련 인수가 포함됩니다.

동적 데이터 교환 메시지 흐름

일반적인 DDE 대화는 다음 이벤트로 구성됩니다.

  1. 클라이언트 애플리케이션이 대화를 시작하고 서버 애플리케이션이 응답합니다.

  2. 애플리케이션은 다음 방법 중 어느 또는 전부로 데이터를 교환합니다.

      • 서버 애플리케이션은 클라이언트의 요청에 따라 클라이언트에 데이터를 보냅니다.
      • 클라이언트 애플리케이션은 서버 애플리케이션에 원치 않는 데이터를 보냅니다.
      • 클라이언트 애플리케이션은 데이터 항목이 변경(웜 데이터 링크)될 때마다 클라이언트에 알리도록 서버 애플리케이션에 요청합니다.
      • 클라이언트 애플리케이션은 데이터가 변경(핫 데이터 링크)될 때마다 서버 애플리케이션에 데이터를 보내도록 요청합니다.
      • 서버 애플리케이션은 클라이언트의 요청에 따라 명령을 수행합니다.
  3. 클라이언트 또는 서버 애플리케이션이 대화를 종료합니다.

클라이언트 또는 서버의 요청을 처리하는 애플리케이션 창은 수신된 순서대로 엄격하게 처리해야 합니다.

클라이언트는 둘 이상의 서버와 대화를 설정할 수 있습니다. 서버는 둘 이상의 클라이언트와 대화를 나눌 수 있습니다. 둘 이상의 원본에서 메시지를 처리할 때 클라이언트 또는 서버는 대화 메시지를 동기적으로 처리해야 하지만 모든 메시지를 동기적으로 처리할 필요는 없습니다. 즉, 필요에 따라 한 대화에서 다른 대화로 이동할 수 있습니다.

애플리케이션이 DDE 응답을 기다리고 있기 때문에 들어오는 요청을 처리할 수 없는 경우 DDEACK 구조의 fBusy 멤버가 1로 설정된 WM_DDE_ACK 메시지를 게시하여 교착 상태를 방지해야 합니다. 어떤 이유로든 적절한 시간 내에 들어오는 요청을 처리할 수 없는 경우 애플리케이션에서 사용 중인 WM_DDE_ACK 메시지를 보낼 수도 있습니다.

애플리케이션은 특정 시간 내에 메시지에 응답하는 클라이언트 또는 서버의 실패를 처리할 수 있어야 합니다. 시간 제한 간격은 애플리케이션의 특성 및 사용자 시스템 구성(네트워크에 연결되어 있는지 여부 포함)에 따라 달라질 수 있으므로 애플리케이션은 사용자가 간격을 지정할 수 있는 방법을 제공해야 합니다.

매개 변수 압축 함수

많은 DDE 메시지의 lParam 매개 변수에는 두 개의 데이터가 포함됩니다. 예를 들어 WM_DDE_DATA 메시지의 lParam에는 데이터 핸들과 원자가 포함됩니다. 애플리케이션은 PackDDElParam 함수를 사용하여 핸들과 원자를 lParam 매개 변수로 압축하고 UnpackDDElParam 함수를 사용하여 값을 제거해야 합니다. DDE 애플리케이션은 DDE 대화 중에 게시된 모든 메시지에 PackDDElParamUnpackDDElParam 을 사용해야 합니다.

애플리케이션은 ReuseDDElParamFreeDDElParam 함수를 사용할 수도 있습니다. ReuseDDElParam 을 사용하면 DDE 애플리케이션이 압축된 lParam 매개 변수를 다시 사용할 수 있으므로 대화 중에 애플리케이션이 수행해야 하는 메모리 재할당 수를 줄일 수 있습니다. 애플리케이션은 FreeDDElParam 을 사용하여 DDE 대화 중에 받은 데이터 핸들과 연결된 메모리를 해제할 수 있습니다.

동적 데이터 교환 및 가장

서버가 클라이언트를 가장할 수 있도록 하기 위해 클라이언트는 DdeSetQualityOfService 함수를 호출합니다. SECURITY_IMPERSONATION_LEVEL 구조는 서버에서 수행할 수 있는 가장 수준을 제어하는 데 사용됩니다.

DDE 서버는 ImpersonateDdeClientWindow 함수를 호출하여 DDE 클라이언트를 가장할 수 있습니다. DDEML 서버는 DdeImpersonateClient 함수를 사용해야 합니다.