// #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 ); // 리턴값은 내가 해제한다
}