| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 
 | STDMETHODIMP CMyAddin::PutProperty(LPDISPATCH pDisp, LPOLESTR pszName, VARIANT* pvValue)
{
   if (NULL == pDisp) return E_POINTER;
   if (NULL == pvValue) return E_POINTER;
   DISPID dwDispID;
	DISPID dispidPut = DISPID_PROPERTYPUT;
	DISPPARAMS dispparams = {NULL, NULL, 1, 1};
	dispparams.rgvarg = pvValue;
	dispparams.rgdispidNamedArgs = &dispidPut;
	HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &pszName, 1, LOCALE_USER_DEFAULT, &dwDispID);
	if(SUCCEEDED(hr)) {
		if (pvValue->vt == VT_UNKNOWN || pvValue->vt == VT_DISPATCH || 
			(pvValue->vt & VT_ARRAY) || (pvValue->vt & VT_BYREF))
		{
			hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
				DISPATCH_METHOD | DISPATCH_PROPERTYPUTREF, &dispparams,
            NULL, NULL, NULL);
			if (SUCCEEDED(hr)) return hr;
		}
		hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
			   DISPATCH_METHOD | DISPATCH_PROPERTYPUT, &dispparams,
            NULL, NULL, NULL);
   }
	return hr;
}
STDMETHODIMP CMyAddin::CallMethod(LPDISPATCH pDisp, LPOLESTR pszName, VARIANT* pvResult, UINT cArgs, VARIANTARG* rgVarParams)
{
    if (NULL == pDisp) return E_POINTER;
    DISPID dwDispID;
    DISPPARAMS dispparams = {NULL, NULL, 0, 0};
    dispparams.rgvarg = rgVarParams;
    dispparams.cArgs = cArgs;
    HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &pszName, 1, LOCALE_USER_DEFAULT, &dwDispID);
    if(SUCCEEDED(hr)) {
        hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
                DISPATCH_METHOD, &dispparams, pvResult, NULL, NULL);
        if (FAILED(hr)) 
		{
			hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
                    DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dispparams, pvResult, NULL, NULL);
        }
    }
	return hr;
} |