如何通过注册表的CLSID加载ITypeInfo

前言

本人最近做了一个自动化网页填充的软件,对网页的操作比较频繁,并发现有些网页会调用三方库的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值