HRESULT PutProperty(IDispatch* pDisp, OLECHAR* pwszName, const VARIANT* pvValue) { HRESULT hr; DISPID dispID; DISPID dispIDNamedArgs[1] = { DISPID_PROPERTYPUT }; // DISPID を取得 hr = GetIDOfName(pDisp, pwszName, &dispID); if (FAILED(hr)) { return hr; } VARIANTARG vArgs[1]; VariantInit(&vArgs[0]); VariantCopy(&vArgs[0], const_cast<VARIANT*>(pvValue)); DISPPARAMS dispParams; dispParams.rgvarg = vArgs; dispParams.rgdispidNamedArgs = dispIDNamedArgs; dispParams.cArgs = 1; dispParams.cNamedArgs = 1; hr = pDisp->Invoke( dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams, NULL, NULL, NULL); VariantClear(&vArgs[0]); return hr; }
HRESULT CMObject::PutPropertyByName(LPCTSTR lpsz, VARIANT* pVar) { DISPID dwDispID; if(p==NULL) return -1; HRESULT hr = GetIDOfName(lpsz, &dwDispID); if (SUCCEEDED(hr)) hr = PutProperty(p, dwDispID, pVar); return hr; }
_variant_t CMObject::GetPropertyByName(LPCTSTR lpsz) { _variant_t vRet; vRet.ChangeType(VT_EMPTY); if(p==NULL) return vRet; DISPID dwDispID; HRESULT hr = GetIDOfName(lpsz, &dwDispID); if (SUCCEEDED(hr)) GetProperty(p, dwDispID, &vRet); return vRet; }
// Invoke a method by name with no parameters _variant_t CMObject::Invoke0(LPCTSTR lpszName) { HRESULT hr; DISPID dispid; _variant_t varRet; if(p==NULL) return varRet; hr = GetIDOfName(lpszName, &dispid); if (SUCCEEDED(hr)) varRet = Invoke0(dispid); return varRet; }
_variant_t CMObject::Invoke(LPCTSTR sName, long nParamCount, VARIANT * ...) { _variant_t varRet; if(nParamCount<0 || p==NULL) return varRet; DISPID dispid; GetIDOfName(sName,&dispid); va_list argList; va_start(argList,nParamCount); varRet=InvokeV(dispid,nParamCount,argList); va_end(argList); return varRet; }
HRESULT Invoke(IDispatch* pDisp, OLECHAR* wszMethod, VARIANT* pvResult, int nArgs, ...) { HRESULT hr; DISPID dispID; va_list ap; int i; hr = GetIDOfName(pDisp, wszMethod, &dispID); if (FAILED(hr)) { return hr; } // 引数を VARAINT 配列に設定 VARIANTARG *pvArgs = NULL; if(nArgs > 0){ pvArgs = new VARIANTARG[nArgs]; va_start(ap, nArgs); for(i=0;i<nArgs;i++){ VariantInit(&pvArgs[i]); VariantCopy(&pvArgs[i], &va_arg(ap, VARIANT)); } va_end(ap); } // DISPPARAMS の設定 DISPPARAMS dispParams; dispParams.rgvarg = pvArgs; dispParams.rgdispidNamedArgs = NULL; dispParams.cArgs = nArgs; dispParams.cNamedArgs = 0; hr = pDisp->Invoke( dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParams, pvResult, NULL, NULL); // VARIANT 配列の後始末 for(i=0;i<nArgs;i++){ VariantClear(&pvArgs[i]); } if(pvArgs != NULL){ delete[] pvArgs; pvArgs = NULL; } return hr; }
HRESULT GetProperty(IDispatch* pDisp, OLECHAR* wszName, VARIANT* pvResult) { HRESULT hr; DISPID dispID; DISPPARAMS dispParams = {NULL, NULL, 0, 0}; hr = GetIDOfName(pDisp, wszName, &dispID); if (FAILED(hr)){ return hr; } hr = pDisp->Invoke( dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, pvResult, NULL, NULL); return hr; }
HRESULT CComDispatchDriverEx::GetPropertyByName1(LPOLESTR lpszName, VARIANT vtValue, VARIANT *vtRet) { DISPPARAMS dispParams; HRESULT hr = S_OK; DISPID dwDisp = 0; hr = GetIDOfName(lpszName, &dwDisp); if(FAILED(hr)) return hr; ZeroMemory(&dispParams, sizeof(DISPPARAMS)); dispParams.cArgs = 1; dispParams.rgvarg = &vtValue; hr = p->Invoke(dwDisp, IID_NULL, 0, DISPATCH_PROPERTYGET, &dispParams, vtRet, NULL, NULL); return hr; }