|
gongnim 님이 쓰신 글 :
: 일반어플리케이션에서 외부 COM인 익스플로러를 조작하기 위해 "shdocvw_tlb.cpp", "mshtml_tlb.cpp" 와 헤더를 인클루드하고 CoCreateInstance를 사용해서 IWebBrowser2 인터페이스를 구했습니다.
: 여기서 이벤트를 주는 건 할 수가 있겠는데, 어떻게 Sink event를 구현하는지 막막하군요.
: 우선 제 프로그램이 ATL이 아니라서 ATLAdvise도 사용할 수 없고, MFC처럼 AfxConnectionAdvise를 사용할수도 없고, ㅠㅠ 어쨌든 IWebBrowser2 에서 QueryInterface를 이용해IConnectionPointContainer를 구해도 NULL값이 나오는군요. 이러니 IConnectionPoint도 구할 수가 없습니다.그리고 Advise하는 방법과 Sink 인터페이스를 단순하게 이벤트 싱크 개체 클래스를 구해야하는지 잘 모르겠습니다.
: 모르는게 너무 많아서 헤메고 있답니다. COM의 고수님들이 자세하게 설명해주시면 감사하겠습니다
:
: --- Change World ---
:
:
음 빌더로 컴을 하시는 분을 보니 반갑네요. 제가 아는 것을 좀 시부리죠~ =ㅅ=;;
정확한 용어는 이벤트 싱크입니다. 이넘이 하는 일은 콜백 함수와 비슷하게 호출받는 쪽에서
호출하는 쪽으로 통지성 이벤트 같은 것을 보내면 그것을 받는 역할을 합니다. 그러니까
이벤트 싱크를 받는 것이 아니라 이벤트를 이넘이 받습니다.
즉 쉽게 말해 클라이언트 쪽의 컴 객체를 말합니다.
타입라이브러리는 컴에 있어서 일종의 프로토콜 역할을 하는 것이므로 대단히 중요합니다.
일단 남의 꺼를 사용할경우 tlb 파일 형태로 빌더에서 볼수만 있다면 반은 끝난거나 다름 없습니다.
빌더의 타입 라이브러리 에디터에서 다이아몬드 형태의 disinterface 부분이 있다면
(정확히 말하면 dispatch interface 이고 이 넘은 듀얼 인터페이스를 가진 컴 객체 넘들 중에는
꼭 있습니다. 스크립트나 VB 같은 고급애들이 사용하는 인터페이스를 지원하는 넘들인데~
걍 빌더에서는 좀 어려워도 프록시/스텁을 유도해야 하는 탁구채 모양 - 피 핫도근가.... =ㅅ=;; -
의 커스텀 인터페이스를 쓰시길 추천합니다. 더 빠르고 낫습니다.)
햐 딱, 걸렸네 하고 당장 펼쳐서 메소드를 스읍 맛봅니다.
On~ 뭐시기로 시작하는 메소드가 있다면 틀림없이 서버의 컴 객체가 보낸 이벤트를 받는 놈임에
틀림 없습니다. 그럼 뭐 끝났쥐~ =ㅅ=;; 클라이언트 어플에다 타입라이브러리 추가하고
본 폼에다가 그 서버 객체하나 선언하고 이벤트 싱크 객체하나 선언하고 이벤트 받을때
어케 하게따 하는 이벤트 핸들러 함수 하나 만들고 이렇게 3개 만든 후에
=ㅅ= : 서버객체
^ㅅ^ : 이벤트 싱크 객체 - 이벤트를 다룰 클래스 객체 - 여기선 남의 것 쓰니 좀 그렇네...
직접 구현시 첨부 참조요. --- 공님에게 중요한것
^0^ : 클라이언트에서 맹근 이벤트 받을 때 활약하는 이벤트 핸들러 함수
+ㅁ+ : 타입라이브러리 에디터에서 본 다이아몬드 항목 밑의 컴 객체 이벤트 함수
폼 생성시에 ( 뭐 암래도 조타 )
=ㅅ= = Co클래스::Create();
^ㅅ^.+ㅁ+ = ^0^;
^ㅅ^.Connect(=ㅅ=);
첨부대로 하자면
클라이언트 폼에서
#include "MedusaSink.h"
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
FMedusa = CoMedusa::Create();
// Connect dispatch events
FMedusaSink.OnMedusaSignReady = OnMedusaSignReady;
FMedusaSink.Connect(FMedusa);
}
음 설명을 넘 어렵게 했나 차라리 걍 책보는게 훨 낫겠네~ =ㅅ=;;
|