VT_BYREF

前言

如果使用变体类型的出参,必须指定VT_BYREF和数据类型的或

typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;typedef struct tagVARIANT  {VARTYPE vt;unsigned short wReserved1;unsigned short wReserved2;unsigned short wReserved3;union {Byte                    bVal;                 // VT_UI1.Short                   iVal;                 // VT_I2.long                    lVal;                 // VT_I4.float                   fltVal;               // VT_R4.double                  dblVal;               // VT_R8.VARIANT_BOOL            boolVal;              // VT_BOOL.SCODE                   scode;                // VT_ERROR.CY                      cyVal;                // VT_CY.DATE                    date;                 // VT_DATE.BSTR                    bstrVal;              // VT_BSTR.DECIMAL                 FAR* pdecVal          // VT_BYREF|VT_DECIMAL.IUnknown                FAR* punkVal;         // VT_UNKNOWN.IDispatch               FAR* pdispVal;        // VT_DISPATCH.SAFEARRAY               FAR* parray;          // VT_ARRAY|*.Byte                    FAR* pbVal;           // VT_BYREF|VT_UI1.short                   FAR* piVal;           // VT_BYREF|VT_I2.long                    FAR* plVal;           // VT_BYREF|VT_I4.float                   FAR* pfltVal;         // VT_BYREF|VT_R4.double                  FAR* pdblVal;         // VT_BYREF|VT_R8.VARIANT_BOOL            FAR* pboolVal;        // VT_BYREF|VT_BOOL.SCODE                   FAR* pscode;          // VT_BYREF|VT_ERROR.CY                      FAR* pcyVal;          // VT_BYREF|VT_CY.DATE                    FAR* pdate;           // VT_BYREF|VT_DATE.BSTR                    FAR* pbstrVal;        // VT_BYREF|VT_BSTR.IUnknown                FAR* FAR* ppunkVal;   // VT_BYREF|VT_UNKNOWN.IDispatch               FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH.SAFEARRAY               FAR* FAR* pparray;    // VT_ARRAY|*.VARIANT                 FAR* pvarVal;         // VT_BYREF|VT_VARIANT.void                    FAR* byref;           // Generic ByRef.char                    cVal;                 // VT_I1.unsigned short          uiVal;                // VT_UI2.unsigned long           ulVal;                // VT_UI4.int                     intVal;               // VT_INT.unsigned int            uintVal;              // VT_UINT.char FAR *              pcVal;                // VT_BYREF|VT_I1.unsigned short FAR *    puiVal;               // VT_BYREF|VT_UI2.unsigned long FAR *     pulVal;               // VT_BYREF|VT_UI4.int FAR *               pintVal;              // VT_BYREF|VT_INT.unsigned int FAR *      puintVal;             //VT_BYREF|VT_UINT.};
};

例子

void fnTest2() {HRESULT hr = S_FALSE;LONG lRc = 0;CLSID clsid;BSTR bstrStr = NULL;IUnknown* pUnk = NULL;IDispatch* pDispatch = NULL;OLECHAR* szFunction = NULL;DISPID dispid;DISPPARAMS dispparams = {NULL, NULL, 0, 0};VARIANT var[10];VARIANT varRc[10];LONG lVal[10] = {0};do {hr = CLSIDFromProgID(OLESTR("MyStringComDll.MyString.1"), &clsid);if (FAILED(hr)) {break;}hr = CoCreateInstance(CLSID_MyString, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnk);if (FAILED(hr)) {break;}hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispatch);if (FAILED(hr)) {break;}szFunction = OLESTR("test");/// 出参 dispid 为虚表中length函数对应的索引项hr = pDispatch->GetIDsOfNames(IID_NULL, &szFunction, 1, LOCALE_USER_DEFAULT, &dispid);if (FAILED(hr)) {break;}/// 使用出参的例子, 要使用VARIANT.pX, VARIANT.vt 必须是VT_BYREF | VT_数据类型var[0].vt = VT_BYREF | VT_I4;var[0].plVal = &lVal[1];var[1].vt = VT_BYREF | VT_I4;var[1].plVal = &lVal[0];dispparams.rgvarg = var;dispparams.rgdispidNamedArgs = NULL; dispparams.cArgs = 2;dispparams.cNamedArgs = 0;hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT,DISPATCH_METHOD, &dispparams, varRc, NULL, NULL);if (FAILED(hr)) {break;}wprintf(L"all ok\n");} while (0);if (NULL != pDispatch) {pDispatch->Release();}if (NULL != pUnk) {pUnk->Release();}
}

COM接口定义与实现

// MyStringComDll.idl : IDL source for MyStringComDll.dll
//// This file will be processed by the MIDL tool to
// produce the type library (MyStringComDll.tlb) and marshalling code.import "oaidl.idl";
import "ocidl.idl";[object,uuid(DEA21FB9-6309-4B7C-BA39-453685F6B081),dual,helpstring("IMyString Interface"),pointer_default(unique)]interface IMyString : IDispatch{[id(1), helpstring("字符串赋值")] HRESULT assignment([in] LPOLESTR lpszSrc);[id(2), helpstring("字符串是否相等,靠出参返回")] HRESULT isEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);[id(3), helpstring("字符串是否不相等")] HRESULT isNotEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);[id(4), helpstring("字符串是否<入参字符串")] HRESULT isLessThan([in] LPOLESTR lpszSrc, [out]LONG* lplRc);[id(5), helpstring("字符串是否<=入参字符串")] HRESULT isLessThanOrEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);[id(6), helpstring("字符串是否>入参字符串")] HRESULT isGreateThan([in] LPOLESTR lpszSrc, [out]LONG* lplRc);[id(7), helpstring("字符串是否>=入参字符串")] HRESULT isGreateThanOrEqual([in] LPOLESTR lpszSrc, [out]LONG* lplRc);[id(8), helpstring("字符串是为空")] HRESULT isEmpty([out]LONG* lplRc);[id(9), helpstring("附加一个字符串")] HRESULT Appends([in] LPOLESTR lpszSrc);[id(10), helpstring("求字符串长度")] HRESULT length([out]LONG* lplRc);[id(11), helpstring("得到字符串")] HRESULT GetString([out]BSTR* lpBstrStr);[id(12), helpstring("method test")] HRESULT test([out] long* lRc1, [out] long* lRc2 );};[uuid(3F08DFAB-AF55-45DE-93D4-8120F9C67D44),version(1.0),helpstring("MyStringComDll 1.0 Type Library")
]
library MYSTRINGCOMDLLLib
{importlib("stdole32.tlb");importlib("stdole2.tlb");[uuid(26EF0212-1BF7-4E01-9988-37AD60087846),helpstring("MyString Class")]coclass MyString{[default] interface IMyString;};
};
// MyString.h : Declaration of the CMyString#ifndef __MYSTRING_H_
#define __MYSTRING_H_#include "resource.h"       // main symbols
#include  ///< for _bstr_t/////////////////////////////////////////////////////////////////////////////
// CMyString
class ATL_NO_VTABLE CMyString : public CComObjectRootEx,public CComCoClass,public IDispatchImpl
{
public:CMyString(){m_bstrStr = OLESTR("");}DECLARE_REGISTRY_RESOURCEID(IDR_MYSTRING)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CMyString)COM_INTERFACE_ENTRY(IMyString)COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()// IMyString
public:STDMETHOD(test)(/*[out]*/ long* lRc1, /*[out]*/ long* lRc2 );STDMETHOD(isNotEqual)(/*[in]*/ LPOLESTR lpszSrc, /*[out]*/LONG* lplRc);STDMETHOD(assignment)(/*[in]*/  LPOLESTR lpszSrc);STDMETHOD(isEqual)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);STDMETHOD(isLessThan)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);STDMETHOD(isLessThanOrEqual)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);STDMETHOD(isGreateThan)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);STDMETHOD(isGreateThanOrEqual)(/*[in]*/  LPOLESTR lpszSrc, /*[out]*/ LONG* lplRc);STDMETHOD(isEmpty)(/*[out]*/ LONG* lplRc);STDMETHOD(Appends)(/*[in]*/  LPOLESTR lpszSrc);STDMETHOD(length)(/*[out]*/ LONG* lplRc);STDMETHOD(GetString)(/*[out]*/ BSTR* lpBstrStr);/// 私有成员变量
private:_bstr_t m_bstrStr; ///< 保存外面传来的字符串
};#endif //__MYSTRING_H_
STDMETHODIMP CMyString::test(long *lRc1, long *lRc2)
{if ((NULL == lRc1) || (NULL == lRc2)) {return ERROR_INVALID_PARAMETER;}*lRc1 = 0x1111;*lRc2 = 0x2222;return S_OK; ///< invoke时,返回的hr并不是这里的返回值
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部