Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  Clipboard Viewer Chain Problem 
작성일시 : 2008. 10. 8. 11:51 | 분류 : Windows Server/Terminal Service

최근에 Clipboard 와 관련된 문제가 있었습니다.
Windows 에서 가끔씩 Clipboard 의 내용이 공유가 않되는 경우가 있습니다.
특히 Terminal Service를 이용할 때 자주 발생하게 되는데, 이 가장 큰 이유는 RDPClip.exe의 Clipboard viewer Chain이 끈어지기 때문입니다.
그와 관련해 제 친구 동조 블로그에 좋은 글 (http://dongjo.tistory.com/102) 이 올라와서 부연 설명을 더해 드립니다.

Windows 에서 Clipboard의 내용은 각 Application 들이 각자 관리 하게 됩니다.
Clipboard를 사용하도록 선언이 되게 되면 이 App 들은 각자 Clipboard를 관리하게되며, 각 App들에서 Clipboard의 내용이 변경 되게 되면 해당 내용을 update 받게 됩니다. 이를 Clipboard viewer chain 이라 합니다.
이런 연관 관계를 Clipboard viewer chain 이라 합니다.

[Clipboard Viewer Chain의 생성]
최초로 A 라는 Clipboard를 사용 하는 app가 실행 됩니다.
-> A

B app 가 실행 됩니다.
-> B -> A

C 와 D app 가 차례로 실행 됩니다.
-> D -> C -> B -> A

[Clipboard Viewer Chain 에서 Clipboard 내용 변경]
-> D -> C -> B -> A 와 같은 체인의 B app에서 사용자가 clipboard 의 내용을 변경 합니다.
-> D -> C -> B -> A
                    ^
        clipboard 내용 변경

해당 내용의 자신의 Chain의 가장 앞 노드인 D에 알리게 되고 D는 자신과 연결된 Chain에 해당 Update 내용을 전달 하게 됩니다.

[Clipboard Viewer Chain 에서 app 종료]
-> D -> C -> B -> A 에서 B가 종료 됩니다.
-> D -> C -> A

이 경우 B의 위치에 A가 자리 하게 됩니다.
즉 B의 Windows 핸들 값을 A 값이 대체하게 됩니다.

[일반적인 문제 현상과 그 원인]
위의 예에서 B가 종료 되면서 자신의 핸들값을 A의 값으로 대체 하지 못하고, 종료 되는 경우 A는 고립이 되게 되며 clipboard의 update를 확인 할 수 없습니다.

이런 경우는 보통 B app 소스에 문제가 있는 경우 가 있습니다.
일반적으로 Windows.close 같은 함수를 이용하여 종료할 경우에는 위와 같은 문제가 발생 하지 않습니다.
하지만 process.kill 과 같은 함수를 이용할 경우 해당 kill 에 대한 예외 처리를 하지 않으면 종종 발생하는 것으로 보입니다.

아래와 같이 예외 처리를 해줍니다.
간단하게 자신의 Windows 핸들을 다음 노드의 핸들로 대체해주는 구문입니다.
그리고 WM_DESTROY는 바로 비정상 종료를 가르키는 상수 값입니다.

case WM_DESTROY:      ChangeClipboardChain(hwnd, hwndNextViewer);
     PostQuitMessage(0);
     Break;

[Terminal Service 이용시 Clipboard 공유 문제]
사용자가 Terminal 연결을 할 경우 Windows에서는 해당 사용자를 위한 세션을 생성하고 그 위에서 다양한 Terminal 환경을 위한 App 를 구동하게 됩니다.
이 중 서버와 클라이언트의 Clipboard 내용을 동기화 하게 위해서 사용하는 app가 있는데, 이 app가 RDPClip.exe 입니다.
사용자가 터미널 서버에 접속하게 되면 RDPClip.exe가 hidden Windows 를 생성하여 위에서 설명한것과 같이 clipboard를 공유하게 됩니다.
이때 중요한 것이 해당 app가 chain의 가장 첫번째 생성 노드라는 점 입니다.
즉 해당 노드 app 중 하나의 app만 정상 종료가 않되게 되는 상황이 발생하게 된다면 이 RDPChain.exe는 clipboard update 내용을 확인 할 수 없는 것입니다.

[Terminal Service 이용시 Clipboard 공유 문제 해결 방안]
근본적으로는 위에서 언급한 것과 같이 clipboard를 사용함에 있어 다양한 예외 상황에 대한 처리를 app에서 해주는 것이 좋습니다.
하지만 그게 불가능 하다면 단순하게 RDPClip.exe를 재 시작하여 문제를 해결 할 수 도 있습니다.
RDPClip.exe가 신규 노드로 추가가 된다면 당연 이전의 고립 문제는 해결이 되게 되는 것이죠.

Windows Vista 및 Windows 2008에서는 OS 차원에서 System Controlled Clipboard Chain을 제공하고 있어 위와 같은 문제가 발생 하지 않습니다.

[클립 보드 문제 해결 방법]
.

참고 및 출처
http://blogs.msdn.com/ts/archive/2006/11/16/why-does-my-shared-clipboard-not-work-part-1.aspx

|