COM, ATL

Property 와 Method 클라이언트 사용 구현부분 참조

디버그정 2008. 8. 19. 10:59

Property Put

 

	HRESULT hr;

	// 0. IDispatch 인터페이스를 구현하는 객체 생성
	IDispatch pIDisp;
	pIDisp.CreateInstance(_T("{XXX-XXX...X-XXX}"));

	// 1. Property의 Dispatch ID를 구함
	OLECHAR * szMethodName = L"MyProperty";
	DISPID dispidProperty;
	hr = dispidMethod->GetIDsOfNames(IID_NULL, &szMethodName, 1,
                LOCALE_USER_DEFAULT, &dispidProperty);

	// 2. 매개변수 준비
	// MyProperty가 BSTR 타입인 경우
	VARIANT varArg;		// 입력 매개변수용 VARIANT
	varArg.vt = VT_BSTR;
	varArg.bstrVal = _bstr_t("TEST");

	DISPPARAMS dispparams;
	dispparams.rgvarg = &varArg;
	dispparams.cArgs = 1;		// 매개변수 총 개수
	// 중요!!! 아래와 같이 설정해야 함
	dispparams.cNamedArgs = 1;
	DISPID mydispid = DISPID_PROPERTYPUT;
	dispparams.rgdispidNamedArgs = &mydispid;

	// 호출
	hr = pIDisp->Invoke(
		dispidProperty, 
		IID_NULL,
		LOCALE_USER_DEFAULT,
		DISPATCH_PROPERTYPUT,	// Property Put 호출임을 지정
		&dispparams,		// 매개변수 지정
		NULL, NULL, NULL);



Method 호출


	HRESULT hr;

	// 0. IDispatch 인터페이스를 구현하는 객체 생성
	IDispatch pIDisp;
	pIDisp.CreateInstance(_T("{XXX-XXX...X-XXX}"));

	// 1. Method의 Dispatch ID를 구함
	OLECHAR * szMethodName = L"MyMethod";
	DISPID dispidMethod;
	hr = dispidMethod->GetIDsOfNames(IID_NULL, &szMethodName, 1,
                LOCALE_USER_DEFAULT, &dispidMethod);

	// 2. 매개변수 준비
	// MyMethod(long A, double B, IMyInterface * C); 인 경우
	VARIANT varArgs[3];		// 실제 매개변수 배열
	// 주의!!! 매개변수는 역순으로 대입한다.
	varArgs[0].vt = VT_UNKNOWN;
	varArgs[0].punkVal = pIMyInterface;
	varArgs[1].vt = VT_R8;
	varArgs[1].dblVal = 20.234;
	varArgs[2].vt = VT_INT;
	varArgs[2].lVal = 10;

	DISPPARAMS dispparams;
	dispparams.rgvarg = varArgs;
	dispparams.cArgs = 3;		// 매개변수 총 개수
	dispparams.cNamedArgs = 0;	// 이름 지정형태의 매개변수 개수

	// 3. 호출
	hr = pIDisp->Invoke(
		dispidMethod, 
		IID_NULL,
		LOCALE_USER_DEFAULT,
		DISPATCH_METHOD,		// Method 호출임을 지정
		&dispparams,			// 매개변수 지정
		NULL, NULL, NULL);


'COM, ATL' 카테고리의 다른 글

표준 마샬링 좋은 예제  (1) 2008.08.28
ATL and Dual Interfaces  (0) 2008.08.28
ATL_COM Event 사용 하기. COM  (0) 2008.08.20
COM인터페이스 디자인 가이드  (0) 2008.08.18
lcid 로케일  (0) 2008.08.18
IDispatch::Invoke  (1) 2008.08.16
인보크 구현부 참조  (2) 2008.08.16