dde — Dynamic Data Exchange 명령 실행하기
dde — Dynamic Data Exchange 명령 실행하기
Windows에서 다른 응용 프로그램과 데이터를 주고받아야 할 때가 있어요. 예를 들어 Tcl에서 Excel의 셀 값을 읽거나 인터넷 익스플로러에 명령을 보내고 싶을 때요. 이때 쓰는 메커니즘이 DDE(Dynamic Data Exchange)이고, Tcl은 dde 명령으로 이 기능을 제공해요.
출처: Tcl 공식 문서 — dde
본문
시그니처
package require dde 1.4
dde servername ?-force? ?-handler proc? ?--? ?topic?
dde execute ?-async? ?-binary? service topic data
dde poke ?-binary? service topic item data
dde request ?-binary? service topic item
dde services service topic
dde eval ?-async? topic cmd ?arg arg ...?
설명
이 명령은 응용 프로그램이 Microsoft Windows에서 실행 중일 때 DDE(Dynamic Data Exchange) 명령을 보낼 수 있게 해 줘요. DDE는 응용 프로그램들이 원시 데이터를 주고받을 수 있게 하는 메커니즘이에요. 각 DDE 트랜잭션에는 서비스 이름(service)과 토픽(topic)이 필요해요. 서비스 이름과 토픽 모두 응용 프로그램이 정하며, Tcl은 서비스 이름 TclEval을 쓰고 토픽 이름은 dde servername이 부여한 인터프리터 이름이에요. 다른 응용 프로그램은 각자 자기만의 서비스 이름·토픽을 가져요. 예를 들어 Microsoft Excel은 서비스 이름이 Excel이에요.
DDE 명령
다음 명령들은 전체 DDE 명령 집합의 일부예요.
dde servername ?-force? ?-handler proc? ?--? ?topic?
dde servername은 인터프리터를 서비스 이름 TclEval, 토픽 이름 topic인 DDE 서버로 등록해요. 토픽을 주지 않으면 현재 토픽 이름을 반환하며, 서비스로 등록되지 않았으면 빈 문자열을 반환해요. 주어진 토픽 이름이 이미 사용 중이면 이름에 " #2"나 " #3" 같은 접미사를 붙여 고유하게 만들어요. 명령 결과는 실제로 사용된 이름이에요. -force 옵션은 정확히 그 토픽 이름을 강제로 등록하는 데 써요.
-handler 옵션은 dde 서버로 들어오는 호출을 처리할 Tcl 프로시저를 지정해요. 패키지가 safe 인터프리터에 로드됐으면 -handler 프로시저를 반드시 정의해야 해요. 그 프로시저는 원격 호출이 전달한 모든 인자와 함께 호출돼요.
dde execute ?-async? ?-binary? service topic data
dde execute는 data를 가져와 service가 나타내는 서버에 topic 토픽으로 보내요. 보통 service는 응용 프로그램 이름이고, topic은 작업할 파일이에요. data 필드는 원격 응용 프로그램에 전달돼요. 보통 응용 프로그램은 data 필드를 스크립트로 취급해 실행해요. -async 옵션은 비동기 호출을 요청해요. -async 플래그를 쓰면 명령은 에러 없이 즉시 반환하지만, 쓰지 않으면 스크립트가 실행되지 않았을 때 에러 메시지를 반환해요.
-binary 옵션 없이 보내면 모든 데이터는 유니코드로 전송돼요. CF_UNICODE 클립보드 형식을 구현하지 않은 dde 클라이언트를 위해 이것은 자동으로 시스템 인코딩으로 변환돼요. -binary 옵션은 encoding convertto의 결과와 함께 쓰면 다른 인코딩으로 데이터를 보낼 수 있어요.
dde poke ?-binary? service topic item data
dde poke는 data를 service가 나타내는 서버에 topic·item을 지정해 전달해요. 보통 service는 응용 프로그램 이름이에요. topic은 응용 프로그램마다 다르지만 서버에 보내는 명령이거나 작업할 파일 이름일 수 있어요. item도 응용 프로그램마다 다르며 자주 안 쓰이지만 항상 null이 아니어야 해요. data 필드는 원격 응용 프로그램에 주어져요.
-binary 없이 보내면 모든 데이터는 유니코드로 전송되고, CF_UNICODE를 구현하지 않은 클라이언트를 위해 시스템 인코딩으로 자동 변환돼요. -binary는 encoding convertto의 결과와 함께 쓰면 다른 인코딩으로 보낼 수 있어요.
dde request ?-binary? service topic item
dde request는 보통 무언가의 값을 얻는 데 써요 — Microsoft Excel의 셀 값이나 Microsoft Word의 선택 영역 텍스트 같은 것들이요. service는 보통 응용 프로그램 이름, topic은 보통 파일 이름, item은 응용 프로그램별 값이에요. 명령은 응용 프로그램이 정의한 item의 값을 반환해요. 보통은 종료 null이 있는 문자열로 해석돼요. -binary를 지정하면 결과는 바이트 배열로 반환돼요.
dde services service topic
dde services는 현재 기계에 존재하는 service-topic 쌍의 목록을 반환해요. service와 topic이 둘 다 빈 문자열({})이면 시스템에서 현재 사용 가능한 모든 service-topic 쌍을 반환해요. service는 비고 topic만 있으면 지정 토픽을 가진 모든 서비스를 반환해요. service가 있고 topic이 없으면 주어진 서비스의 모든 토픽을 반환해요. 둘 다 있으면 해당 service-topic 쌍이 존재할 때만 반환하고, 아니면 빈 문자열을 반환해요.
dde eval ?-async? topic cmd ?arg arg ...?
dde eval은 topic이 지정한 인터프리터로 명령과 인자를 평가해요. DDE 서비스는 반드시 TclEval 서비스여야 해요. -async 옵션은 비동기 호출을 요청해요. -async를 쓰면 에러 없이 즉시 반환하고, 아니면 스크립트가 실행되지 않았을 때 에러 메시지를 반환해요. 이 명령은 Windows에서 send를 대체하는 데 쓸 수 있어요.
DDE와 Tcl
Tcl 인터프리터는 항상 서비스 이름 TclEval을 가져요. 실행 중인 모든 Tcl 응용 프로그램의 각 인터프리터에는 dde servername으로 지정한 고유 이름을 줘야 해요. 각 인터프리터는 dde servername 명령으로 그 인터프리터의 토픽 이름을 설정했을 때만 DDE 토픽으로 사용 가능해져요. 그래서 dde services TclEval {} 명령은 service-topic 쌍 목록을 반환하며, 실행 중인 각 인터프리터가 토픽이 돼요.
Tcl이 dde execute 명령을 처리하면, execute의 데이터는 dde execute 명령의 토픽이 지정하는 인터프리터에서 스크립트로 실행돼요.
Tcl이 dde request 명령을 처리하면, dde 명령에 주어진 변수의 값을 dde 토픽이 지정하는 인터프리터의 컨텍스트에서 반환해요. Tcl은 변수 $TCLEVAL$EXECUTE$RESULT를 내부 용도로 예약하므로, 그 변수에 대한 dde request는 예측할 수 없는 결과를 줘요.
Tcl에서 스크립트를 실행시키려는 외부 응용 프로그램은 그 스크립트가 결과를 변수에 저장하게 하고, dde execute 명령을 실행한 뒤 dde request로 그 변수 값을 얻어야 해요.
DDE를 쓸 때는 update나 vwait로 이벤트 큐를 비워줘야 해요. wish를 사용할 때는 차단 명령(예: &를 붙이지 않은 exec)을 호출하지 않는 한 기본적으로 이렇게 돼요. 어떤 이유로든 이벤트 큐가 비워지지 않으면 DDE 명령이 이벤트 큐가 비워질 때까지 멈출 수 있어요. 이는 교착 상태(deadlock)를 만들 수 있어요.
예제
이미 실행 중인 인터넷 익스플로러에 아주 중요한 웹사이트로 가도록 요청하는 예제예요:
package require dde
dde execute -async iexplore WWW_OpenURL http://www.tcl-lang.org/
더 알아보기
tk,winfo,send- 키워드:
application,dde,name,remote execution