Win32 , C++

IDispatch 멤버 함수 호출하기

김모작자 2008. 11. 19. 10:45

// #1 : RDS 로드
IDispatch *pDispatch = NULL;
RDS::IDataspacePtr pDS;
HRESULT hr_CreateInstance = pDS.CreateInstance(OLESTR("RDS.DataSpace")); //
if (FAILED(hr_CreateInstance))
{
  // assertion
}
// #2 : 해당 COM+ 서버에서 객체 가져오기
 Result = pDS->CreateObject(_bstr_t("Object Program ID"), _bstr_t("Remote Address"));
 HRESULT hr = Result.pdispVal->QueryInterface(_uuidof(IDispatch), (LPVOID*) &pDispatch);
}

// #3 : 해당 컴포넌트의 멤버 함수 번호(Dispatch ID)찾기
// DISPID 는  Type Library 에 함수이름 앞에 나오는 번호와 같다..

LPOLESTR strFuncName = L"Member-Function Name"; // 찾으려는 함수이름
DISPID dispidIssueAdmissionTicket = 0; // 찾으려는 함수의 DISPID

HRESULT hr = pConn->GetIDsOfNames(IID_NULL, &strFuncName, 1, LOCALE_SYSTEM_DEFAULT, &dispidIssueAdmissionTicket);
if( FAILED( hr ) )
{
 // assertion
}

// #4 : 함수 호출하고 문자열 리턴값 가져오기
// string SomeFunction (string, string, string) 형태라고 가정하자...

_bstr_t result; // 리턴값 저장용
BSTR tmp = NULL;
hr = _com_dispatch_method( pConn,  // IDispatch
           dispidIssueAdmissionTicket,  // 아까 찾아낸 DISPID
           DISPATCH_METHOD, // 매서드
           VT_BSTR, // 린턴값 타입
           &tmp,       // 리턴값 들구 올 변수
           L"\x0008\x0008\x0008" ,  // 다음에 나올 파라미터의 종류
           (BSTR)  something1,  // 파라미터1 : 문자열
           (BSTR) something2, // 파라미터2 : 문자열
           (BSTR)something3); // 파라미터3 : 문자열
     if( SUCCEEDED(hr) && tmp != NULL)
     {
      result = tmp; // 내 변수로 복사 (대입이 아님)
      ::SysFreeString( tmp ); // 리턴값은 내가 해제한다
     }