C#-如何取得COM中IDispatch的所有函数名称和参数?

C#-如何取得COM中IDispatch的所有函数名称和参数?

归属感 发布于 2017-05-03 字数 142 浏览 1187 回复 3

例如有如下接口
ISomeInterface::Foo (ISomeInterface是从IDispatch派生)

如果通过IDispatch,来得知ISomeInterface::Foo函数名称

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清晨说ぺ晚安 2017-06-05 3 楼

最简单的方法是使用COMRaider查看,这个软件原本是用作测试COM漏洞的。还可以使用IDA反汇编COM控件进行查看。

虐人心 2017-05-21 2 楼

找到解决方法了,通过GetNextDispID、GetMemberName可以实现函数名的获取

下面是具体代码

VARIANT varParams; //这是脚本传入的参数数组

//如果传入的类型不是VT_DISPATCH就退回出错信息
if(varParams.vt!=VT_DISPATCH)
return E_INVALIDARG;

//取得IDispatchEx接口
CComPtr<IDispatchEx> pDispEx;
HRESULT hr=varParams.pdispVal->QueryInterface(IID_IDispatchEx,(void**)&pDispEx);
if(FAILED(hr))
return E_INVALIDARG;

//枚举所有的属性
DISPID dispid;

//取得第一个元素的DISPID
hr = pDispEx->GetNextDispID(fdexEnumAll, DISPID_STARTENUM, &dispid);
while (hr == NOERROR)
{
//元素名称
CComBSTR bstrName;
hr = pDispEx->GetMemberName(dispid, &bstrName);
if (FAILED(hr))
return E_FAIL;

//元素值
CComVariant vValue;
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
hr = pDispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET, &dispparamsNoArgs,
&vValue, NULL, NULL);
if(FAILED(hr))
return E_FAIL;

//取得下一个元素的DISPID
hr = pDispEx->GetNextDispID(fdexEnumAll, dispid, &dispid);
}

灵芸 2017-05-12 1 楼

一个COM组件的接口函数在开发阶段是用idl定义的,如果支持双接口(IDispatch),则会生成关于接口的所有函数的类型库信息。可以用随SDK带的工具OleViewer来查看。
如果已经知道了组件的IDispatch,则可以通过GetTypeInfo获得ITypeInfo接口,从它可以获得所有的函数名称、参数,返回值等等信息。