前言
本人最近做了一个自动化网页填充的软件,对网页的操作比较频繁,并发现有些网页会调用三方库的API,而我做的软件(其实就是个浏览器)则把方法过滤了导致调用失败。经过一番艰苦的查找后发现需要调用DispGetIDsOfNames方法,而这个方法的第一个参数需要用到ITypeInfo这个接口,最后发现可以使用LoadRegTypeLib 以及 GetTypeInfoOfGuid 从注册表的CLSID中加载对应的插件。
正文
用户注册的Com组件一般存放在注册表的CLSID中,可以通过查找注册表Com组件名称获取该插件的CLSID以及TypeLibID
通过这两个GUID 我们就可以使用LoadRegTypeLib 以及 GetTypeInfoOfGuid 获取ITypeInfo接口了
HRESULT GetDLLTypeInfo(CDuiString strClsid,CDuiString strTypeID , CDuiString strName, ITypeInfo** MyTypeInfo)
{
HRESULT hr;
LPTYPELIB pTypeLib;
CLSID libClid;
IID typID;
DUI__Trace(_T("开始转换CLSID"));
hr = CLSIDFromString(strClsid.GetData(), &libClid);
if (FAILED(hr))
{
DUI__Trace(_T("CLSID 转换失败:%s"), strClsid.GetData());
return hr;
}
DUI__Trace(_T("开始转换IID"));
hr = IIDFromString(strTypeID, &typID);
if (FAILED(hr))
{
DUI__Trace(_T("IID 转换失败:%s"), strTypeID.GetData());
return hr;
}
DUI__Trace(_T("加载RegType Lib :%s"), strClsid.GetData());
hr = LoadRegTypeLib(libClid, 1, 0, 0, &pTypeLib);
if (FAILED(hr)){
DUI__Trace(_T("加载RegType Failt:0x%X"), hr);
return hr;
}
hr = pTypeLib->GetTypeInfoOfGuid(typID, MyTypeInfo);
if (!FAILED(hr))
{
DUI__Trace(_T("加载RegType Info 成功!"));
}
else
{
DUI__Trace(_T("加载RegType Info 失败:0x%X"), hr);
}
pTypeLib->Release();
return(hr);
}
需要注意的是:Clsid传 TypeInfo里面的GUID,而TypeID 要传 CLSID底下的那个GUID