커뮤니티

DDE 와 관련해서 확인을 부탁드립니다

프로필 이미지
날빛2
2015-10-30 14:31:43
2489
글번호 223702
답변완료

첨부 이미지

안녕하세요 DDE 와 관련해서 확인을 부탁드립니다. 1. DDE 객체의 속성을 코드 상에서 설정이 불가능한 것 같습니다 스크립트 속성 화면에서 설정하는 것은 적용이 되지만, 아래처럼 코드 상에서 직접 속성값을 설정하면 적용되지 않습니다. (Read 만 가능하고 Write 는 불가능) DDE1.service = "DDEServ"; DDE1.topic = "Data"; 코드 상으로는 속성 변경이 안되는지 궁금합니다. 2. DDE 객체의 OnRcvItem 함수가 동작이 안되는 것 같습니다. 검증을 위해, 예스스팟 이외에 별도의 DDE 클라이언트를 함께 사용해서 테스트를 해봤습니다. 1. Excel 테스트 A1 셀의 값을 가져오기 위해 그림 1 처럼 DDE1 객체 속성에서 Service 를 EXCEL, Topic 을 지정한 후 DDE1.Request("R1C1") 를 실행했지만, 그림 1 의 디버깅 화면처럼, DDE 객체의 OnRcvItem 함수가 실행되지 않았습니다. (Topic 설정은 "C:Test.xls" 과 "[Test.xls]sheet1" 두 가지를 해봤습니다) 엑셀 파일은 문제가 없었는데, 그림 2 처럼 다른 DDE Client 프로그램을 이용해서 테스트했을 때는 정상적으로 값이 조회되었기 때문입니다. 2. DDE 서버를 이용한 테스트 원인을 찾기 위해, 그림 3 처럼 별도의 DDE 서버 프로그램을 가지고 확인한 결과 예스스팟에서 보낸 Request 가 정상적으로 수신되었고, 이에 대한 응답으로 Item 데이타를 전송하는 것까지는 확인했습니다. 하지만 DDE 객체의 OnRcvItem 함수는 마찬가지로 실행되지 않았는데, (그림 3 처럼, DDE 클라이언트를 가지고 확인했을 때는 정상적으로 값이 조회되었습니다) DDE 서버쪽에서 정상적으로 데이타를 전송해서, OnRcvItem 함수가 실행이 안되는 것 같은데, 확인을 부탁드립니다. 3. 참고로 2 번 테스트에 사용한 코드를 보입니다. var Count; function GetCurrentTime() { d = new Date(); return d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); } function Main_OnStart() { Main.MessageLog("시작 - " + GetCurrentTime()); // 1 초마다 DDE Request 요청 Count = 0; Main.SetTimer(1, 1000); } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.MessageLog("타이머 - " + GetCurrentTime()); // String1 아이템 요청 (정상적인 리턴값은 "123" 의 문자열) DDE1.Request("String1"); if (++Count >= 3) { Main.KillTimer(1); } } } function DDE1_OnRcvItem(sItem, sData) { Main.MessageLog("OnRcvItem"); }
답변 5
프로필 이미지

예스스탁 예스스탁 답변

2015-11-11 14:03:33

> 날빛2 님이 쓴 글입니다. > 제목 : DDE 와 관련해서 확인을 부탁드립니다 > 안녕하세요 DDE 와 관련해서 확인을 부탁드립니다. 1. DDE 객체의 속성을 코드 상에서 설정이 불가능한 것 같습니다 스크립트 속성 화면에서 설정하는 것은 적용이 되지만, 아래처럼 코드 상에서 직접 속성값을 설정하면 적용되지 않습니다. (Read 만 가능하고 Write 는 불가능) DDE1.service = "DDEServ"; DDE1.topic = "Data"; 코드 상으로는 속성 변경이 안되는지 궁금합니다. 2. DDE 객체의 OnRcvItem 함수가 동작이 안되는 것 같습니다. 검증을 위해, 예스스팟 이외에 별도의 DDE 클라이언트를 함께 사용해서 테스트를 해봤습니다. 1. Excel 테스트 A1 셀의 값을 가져오기 위해 그림 1 처럼 DDE1 객체 속성에서 Service 를 EXCEL, Topic 을 지정한 후 DDE1.Request("R1C1") 를 실행했지만, 그림 1 의 디버깅 화면처럼, DDE 객체의 OnRcvItem 함수가 실행되지 않았습니다. (Topic 설정은 "C:Test.xls" 과 "[Test.xls]sheet1" 두 가지를 해봤습니다) 엑셀 파일은 문제가 없었는데, 그림 2 처럼 다른 DDE Client 프로그램을 이용해서 테스트했을 때는 정상적으로 값이 조회되었기 때문입니다. 2. DDE 서버를 이용한 테스트 원인을 찾기 위해, 그림 3 처럼 별도의 DDE 서버 프로그램을 가지고 확인한 결과 예스스팟에서 보낸 Request 가 정상적으로 수신되었고, 이에 대한 응답으로 Item 데이타를 전송하는 것까지는 확인했습니다. 하지만 DDE 객체의 OnRcvItem 함수는 마찬가지로 실행되지 않았는데, (그림 3 처럼, DDE 클라이언트를 가지고 확인했을 때는 정상적으로 값이 조회되었습니다) DDE 서버쪽에서 정상적으로 데이타를 전송해서, OnRcvItem 함수가 실행이 안되는 것 같은데, 확인을 부탁드립니다. 3. 참고로 2 번 테스트에 사용한 코드를 보입니다. var Count; function GetCurrentTime() { d = new Date(); return d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); } function Main_OnStart() { Main.MessageLog("시작 - " + GetCurrentTime()); // 1 초마다 DDE Request 요청 Count = 0; Main.SetTimer(1, 1000); } function Main_OnTimer(nEventID) { if (nEventID == 1) { Main.MessageLog("타이머 - " + GetCurrentTime()); // String1 아이템 요청 (정상적인 리턴값은 "123" 의 문자열) DDE1.Request("String1"); if (++Count >= 3) { Main.KillTimer(1); } } } function DDE1_OnRcvItem(sItem, sData) { Main.MessageLog("OnRcvItem"); }
프로필 이미지

날빛2

2015-11-11 17:30:05

날빛2 님에 의해 삭제된 답변입니다.
프로필 이미지

날빛2

2015-11-12 09:03:26

그림 1 처럼, 알려주신 대로 Item1에 값을 넣어서 해봤으나, 여전히 Receive 함수는 실행되지 않았습니다. 추가로 여러 가지 테스트를 한 결과, OnRevItem 함수가 실행되는 조건을 찾을 수 있었습니다. Advise 가 전송되었을 때인데, 그림 2처럼 OnRevItem 함수가 실행되는 것을 확인할 수 있었습니다. 테스트 결과를 보면, OnRevItem 함수는 Request 에 대한 리턴값을 받았을 때는 실행이 안되고, Advise 가 되었을 때만 실행되는 것으로 보입니다. 만일 이 이야기가 맞다면, 시세처럼 계속해서 데이타가 바뀔 때만 OnRevItem 함수가 실행되기 때문에, 장중에 거래가 없는 시간이 길거나, 또는 엑셀처럼 데이타가 고정된 경우는 데이타를 받지 못하는 문제가 생기게 됩니다. Request 에 대한 리턴값을 처리하지 못한다면, 반쪽짜리 DDE 기능이 제공된다는 의미이기 때문에, 개선이 필요할 것으로 생각됩니다.
프로필 이미지

예스스탁 예스스탁 답변

2015-11-12 09:10:24

안녕하세요 예스스탁입니다. 올려주신 개선사항은 개발팀에 전달하도록 하겠습니다. 현재는 OnRevItem 이벤트는 데이터 변동이 있을때만 이벤트가 동작합니다. Request는 특정 item에 대한 값을 호출할때 사용합니다. value = DDE1.Request("R1C1"); 과 같이 값을 호출하여 저장해서 사용되는 함수입니다. 즐거운 하루되세요 > 날빛2 님이 쓴 글입니다. > 제목 : 원인을 찾은 것 같습니다 > 그림 1 처럼, 알려주신 대로 Item1에 값을 넣어서 해봤으나, 여전히 Receive 함수는 실행되지 않았습니다. 추가로 여러 가지 테스트를 한 결과, OnRevItem 함수가 실행되는 조건을 찾을 수 있었습니다. Advise 가 전송되었을 때인데, 그림 2처럼 OnRevItem 함수가 실행되는 것을 확인할 수 있었습니다. 테스트 결과를 보면, OnRevItem 함수는 Request 에 대한 리턴값을 받았을 때는 실행이 안되고, Advise 가 되었을 때만 실행되는 것으로 보입니다. 만일 이 이야기가 맞다면, 시세처럼 계속해서 데이타가 바뀔 때만 OnRevItem 함수가 실행되기 때문에, 장중에 거래가 없는 시간이 길거나, 또는 엑셀처럼 데이타가 고정된 경우는 데이타를 받지 못하는 문제가 생기게 됩니다. Request 에 대한 리턴값을 처리하지 못한다면, 반쪽짜리 DDE 기능이 제공된다는 의미이기 때문에, 개선이 필요할 것으로 생각됩니다.
프로필 이미지

날빛2

2015-11-12 14:00:13

답장 감사드립니다. 답변하신 내용을 보니까, 제가 잘못 알고 있었던 것 같습니다. Request 를 했을 때, 리턴값이 OnRevItem 쪽으로 넘어오는 줄 알았었는데, "value = DDE1.Request("R1C1")" 와 같이, 직접 값을 받을 수 있나 보군요. DDE1.Request 함수의 리턴값을 고려하지 않았던 이유는, 아래처럼 YesSpotHelp.doc 문서상에서는 반환값이 없다고 나와 있어서 였습니다. ********************************************** 8) DDE 객체 - Request(sItem) 설 명 : 지정된 아이템의 데이터를 요청합니다. 반 환 값 : 없음 매개변수 : sItem – 아이템이름 ********************************************** 그렇다면 DDE 를 사용하는데에는 아무 문제가 없으며, 따로 개선하실 필요는 없을 것 같습니다. 다만 문서는 수정될 필요가 있겠네요. 친절한 답변 고맙습니다. > 안녕하세요 > 예스스탁입니다. > > 올려주신 개선사항은 개발팀에 전달하도록 하겠습니다. > > 현재는 > OnRevItem 이벤트는 데이터 변동이 있을때만 이벤트가 동작합니다. > Request는 특정 item에 대한 값을 호출할때 사용합니다. > value = DDE1.Request("R1C1"); > 과 같이 값을 호출하여 저장해서 사용되는 함수입니다. > > > 즐거운 하루되세요