最近在学习com接口,和A控件,当中有一个函数得到的值为一个LPDISPATCH指针,所以在这跟大家分享一下,怎么通过LPDISPATCH指针来调用com接口中的函数对象。
首先LPDISPATCH指向的是个com接口对象,我们可以先查到这个指针指向的接口它有哪些参数和方法,比如我这个!
由此可见它的指向的是一个IMXDRAWRESBUF接口,接着我们再查查其中有哪些方法,如下:
发现里面有很多函数,接下来我们选择用Atstring这个函数,先查找一下它的参数:参数如下:
这下就知道它的传入参数只需要一个,返回值也知道了,接下来我们将调用GetIDsOfNames函数来得到一个指向这个函数的指针。
具体方法如下:
BSTR PropName[1];
DISPID PropertyID[1] = {0};
PropName[0] = SysAllocString(L"AtString");
HRESULT hr=a->GetIDsOfNames(IID_NULL, PropName, 1, LOCALE_USER_DEFAULT, PropertyID);
当中propName表示这个函数的名称,用DISPID变量Property来接受该函数的指针信息。
其中hr返回值可以帮助我们检索是否得到成功。
然后我们就可以用invoke函数来调用这个接口函数ATSTRING()啦
具体方法如下:
CComVariant avarParams[1];
LONG vTotal = i;
avarParams[0].vt = VT_LPSTR;
avarParams[0] = &vTotal;
CComVariant Result;
DISPPARAMS params = { avarParams,
NULL, // Dispatch identifiers of named arguments.
1, // Number of arguments.
0 }; // Number of named arguments.
;
HRESULT hr2= a->Invoke(PropertyID[0],IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,¶ms,&Result,NULL,NULL);
其中ReSULT是用来接收返回值的,invoke第一个变量就填我们刚才得到的Property,invoke中需要注意的是第四个参数,DISPATCH_METHOD表示你要找接口中的方法函数,如果填成DISPATCH_PROPERTYGET代表你要找该接口的属性,刚开始我就在这里翻了船,params代表着输入者,这样result的返回值就是我们需要的结果啦~