DDE(Dynamic Data Exchange) 란 일종의 IPC(Interprocess Communication)로 공유 메모리를 사용하여
프로그램 간 통신 할 수 있는 기술이다.
현재는 잘 사용하지 않는 기술이고 닷넷에서는 지원하지 않는 구시대적인 기술이지만,
VB6에서 기본적으로 제공하는 기능이 있고 이를 이용하면 손쉽게 적용할 수 있으니 알아두면 유용합니다.
여기에서는 VB6에서 DDE를 이용하여 "이런것도 있다." 정도의 내용만 설명하였고 더 자세한 내용이나 예제는 검색을 통해
정보를 얻으시길 바랍니다.
MSDN에서 DDE 관련 메서드와 속성을 살펴보면 DDE대화 라는 표현을 쓰는데 기능, 기술 보다는 좀 다감하네요.
대화라는 단어에서 알 수 있듯이 통신을 하기위해선 서버와 클라이언트가 있겠죠?
서버가 되는 프로그램을 먼저 작성해 보겠습니다.
프로젝트를 한개 생성하고 "DDEHost" 로 프로젝트명을 수정합니다. 폼의 식별을 위해 Caption값도 "DDEHost"로 합니다.
이제 DDE 대화를 위한 필요 속성을 살펴 보겠습니다.
폼의 LinkMode와 LinkTopic 이 보이는데 MSDN에서 검색하여 한번 훓어보시기 바람니다.
LinkMode 의 설명란을 보면
"DDE 대화에 사용된 연결 형태를 반환하거나 설정하고 연결을 활성화시킵니다." 라고 되어있고, MSDN에 보니
DDE 확인의 원본(서버)으로 사용되는 LinkMode 의 값은 vbLinkNone(사용안함), vbLinkSource(사용함) 두가지가 있네요.
DDE 확인의 원본(서버)로 사용할 것이니 vbLinkSource 라고 설정해야겠죠. 파란색으로 칠해 놓은 부분을 보니 실행모드에서는
속성값 변경이 안되며 디자인 모드에서 설정해야한다는걸 알 수있습니다.
그럼, 디자인 모드에 있는 폼의 LinkMode 값을 "1-원본"로 수정 합니다.
LinkTopic 값은 "Form1" 상태 그대로 둡니다.(이에 대한 설명은 나중에 하도록 하겠습니다.)
이제 통신을 할 텍스트박스 한개를 폼에 가져다 놓고 프로젝트를 저장합니다. EXE파일로 컴파일도 하구요.
이제 서버쪽 프로그램은 끝났습니다.
이게 뭐야? 장난하는건가? 뭔 통신을 한다는건지.. 하는 분을 위해 빠르게 진행하겠습니다.^^
DDE 확인의 대상(클라이언트)로 사용할 프로젝트를 새롭게 열겠습니다.
프로젝트 명칭은 상관없지만 그래도 Project1이라는 무식한 이름보다는 "DDEClient" 라는 이름으로 줘 보겠습니다.
폼에 대화의 대상이 되는 텍스트박스를 한개 두고 타이머를 한개 가져다 놓고 아래 코드를 복사합니다.
Private Sub Form_Load()
Text1.LinkItem = "Text1"
Text1.LinkTopic = "DDEHost|Form1"
Text1.LinkTimeout = 50
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
On Error GoTo errHandler
Text1.LinkMode = vbLinkAutomatic
Me.Caption = "Connected"
Exit Sub
errHandler:
Me.Caption = "Wait"
End Sub
DDE 확인의 대상(클라이언트)로 사용할 프로젝트를 새롭게 열겠습니다.
프로젝트를 저장하고 EXE파일로 컴파일도 합니다.
컴파일한 두개의 프로그램이 만들어져 있죠? "DDEHost" 와 "DDEClient" 프로그램을 각각 띄워놓은 후
"DDEHost" 쪽 텍스트박스의 내용을 변경해 봅니다. "DDEClient" 쪽 텍스트박스의 변화가 있나요?
이렇게 간단하게 두 프로그램 간에 통신이 가능하도록 해주는데 아쉽게 TextBox, Label, PictureBox 컨트롤만 지원한답니다.
이것만 가지고도 충분한 데이터 전달이 이루어질 수 있으니 응용은 직접해보시기 바람니다.
DDE 확인의 대상(클라이언트)에서 사용된 텍스트박스 속성을 보니
LinkItem, LinkTopic, LinkTimeout, LinkMode 가 있고 LinkMode에 대한 설명은 위에서 하였지만 대상이 되어지는 컨트롤에 적용되는 값은 아래와 같이 다릅니다.
상수 |
설정 |
설명 |
VbLinkNone | 0 | (기본값) 없음 — DDE 대화가 없습니다. |
VbLinkAutomatic | 1 |
자동 — 연결된 데이터가 변할 때마다 대상 컨트롤이 업데이트됩니다. |
VbLinkManual | 2 | 수동—LinkRequest가 호출될 때만 대상 컨트롤이 업데이트됩니다. |
VbLinkNotify | 3 | 통보— LinkNotify 이벤트는 연결된 데이터가 변할 때마다 일어납니다. 그러나 대상 컨트롤은 LinkRequest메서드가 호출될 때만 업데이트됩니다. |
LinkItem 은 DDE확인의 원본(서버)에서 사용한 컨트롤인 텍스트박스의 이름을 기입하구요
LinkTimeout는 대화의 응답을 기다리는 시간을 설정하는데 1/10 초 단위로 지정할 수 있으며 기본값은 50(5초)를 가집니다.
LinkTopic 는 위에서 설명을 안했는데 이것도 원본(서버)과 대상(클라이언트)에서의 값이 틀립니다.
먼저 속성의 설명란을 보면
"원본 응용 프로그램과 대상 컨트롤의 항목을 반환하거나 설정합니다." 라고 되어있네요.
원본에서는 응용프로그램을 대상에서는 컨트롤의 항목을... 이란 얘기네요.
DDE확인의 원본(서버)에서 Form의 LinkTopic 값을 "Form1" 으로 그냥 두자고 한걸 기억하시겠죠?
원본에서의 값은 이같이 원본 연결에 필요한 문자열로 구성하면 됩니다.
DDE확인의 대상(클라이언트)의 컨트롤에서 원본으로 연결을 하기 위해서도 LinkTopic 값을 입력하는데
VB6에서는 파이프라인('|') 를 구분문자로 하여 [원본의 프로젝트명]|[원본의 LinkTopic값] 과 같이 값을 가지게 됩니다.
MSDN 을 참고하자면 MS Excel 에서는 아래와 같이 파이프라인('|') 과 느낌표('!') 를 사용하고
application|topic!item
MS Word 에서는 파이프라인('|')이나 느낌표('!')를 사용하지 않고 스페이스(' ')로 구분하는게 다름니다.
application topic item
간단하게 VB6에서 DDE기능을 이용한 데이터의 전달을 해보았는데 이 외에도 아래 이벤트와
(LinkOpen, LinkClose, LinkError, LinkExecute)
메서드들
(LinkPoke, LinkRequest, LinkSend)
을 참고하여 검색해 보면 더욱 많은 정보를 찾을 수 있을 겁니다.
'VB6 > Basic' 카테고리의 다른 글
[내장함수] ParamArray 키워드 (0) | 2013.04.09 |
---|---|
[내장함수] 그림판 선그리기 (0) | 2013.04.09 |
[내장함수] AsyncRead를 이용한 웹이미지 가져오기 (0) | 2013.04.01 |
[내장함수] 해당월에 마지막 날짜 구하기 (1) | 2013.03.29 |
리소스 활용하기 (0) | 2013.03.27 |