• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 如何从ITypeInfo接口返回类型信息

如何从ITypeInfo接口返回类型信息

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了显卡接口类型图解,usb接口类型,光纤接口类型,数据线接口类型,接口类型等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 如何从ITypeInfo接口返回类型信息
描述:

得到ITYPEINFO指针后,如何获得像VB中的对象浏览器的对象列表、方法列表、事件列表、属性列表及其参数?代码、接口函数说明都可以。thank you


解决方案1:

控件的属性列表则通过控件的TypeInfo接口可以得到,得到Dispatch接口指针后,调用
GetTypeInfoCount,往往返回1,或2,第一个接口就是属性和方法的描述,第2个ITypeInfo
接口可能是事件描述的接口,然后调用GetTypeInfo?(可能是吧)得到ITypeInfo接口,
调用ITypeInfo的函数,然后获得函数的数量,根据每一个函数的描述来判断是属性(还分get和put)
还是方法,然后取得该属性的名称,DISPID(Dispatch ID,或称MemberID)
BOOL CPropertyWnd::AddDispatch(IUnknown* pIUnknown)
{
 IDispatch *pDispatch;
 pIUnknown->QueryInterface(IID_IDispatch, (void **)&pDispatch);
 ITypeInfo *pTypeInfo;
 
 if (pDispatch == NULL)
   return FALSE;
 pDispatch->GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, &pTypeInfo);
 if (pTypeInfo == NULL)
   return FALSE;
 
 TYPEATTR* pta;
 pTypeInfo->GetTypeAttr(&pta);
 if (pta->typekind == TKIND_INTERFACE)
 {
   // 取得第二个接口
   ITypeInfo *pInfoTemp;
   HREFTYPE hRef;
   HRESULT hr = pTypeInfo->GetRefTypeOfImplType(-1, &hRef);
   if (FAILED(hr))
     return FALSE;
   hr = pTypeInfo->GetRefTypeInfo(hRef, &pInfoTemp);
   if (FAILED(hr))
     return FALSE;
   pTypeInfo->ReleaseTypeAttr(pta);
   pTypeInfo = pInfoTemp;
   pTypeInfo->GetTypeAttr(&pta);
 }
 int nItem = m_ListCtrl.GetItemCount();
 
 for (int i = 0; i < pta->cFuncs; i++)
 {
   FUNCDESC* pfd;
   pTypeInfo->GetFuncDesc(i, &pfd);
   if (pfd->invkind & DISPATCH_PROPERTYGET
     && (pfd->wFuncFlags & (FUNCFLAG_FRESTRICTED | FUNCFLAG_FHIDDEN)) == 0)
   {
     switch (pfd->elemdescFunc.tdesc.vt)
     {
     case VT_USERDEFINED:
     case VT_EMPTY:
     case VT_NULL:
     case VT_I2:
     case VT_I4:
     case VT_R4:
     case VT_R8:
     case VT_CY:
     case VT_DATE:
     case VT_BSTR:
     case VT_ERROR:
     case VT_BOOL:
     case VT_VARIANT:
     case VT_DECIMAL:
     case VT_I1:
     case VT_UI1:
     case VT_UI2:
     case VT_UI4:
     case VT_INT:
     case VT_UINT:
     case VT_PTR:
       {
         ITypeInfo* pUserTypeInfo = NULL;
         VARTYPE vt;
         vt = pfd->elemdescFunc.tdesc.vt;
         
         if (pfd->elemdescFunc.tdesc.vt == VT_USERDEFINED)
         {
           HREFTYPE hrt = pfd->elemdescFunc.tdesc.hreftype;
           vt = VT_USERDEFINED;
           HRESULT hr = E_FAIL;
           hr = GetEnumTypeInfo(pTypeInfo, hrt, &pUserTypeInfo);
           if(FAILED(hr))
             vt = GetUserDefinedType(pTypeInfo, hrt);
         }
/*          if (pfd->elemdescFunc.tdesc.vt == VT_PTR)
         {
           HREFTYPE hrt = pfd->elemdescFunc.tdesc.lptdesc->hreftype;
           VARTYPE vt = pfd->elemdescFunc.tdesc.lptdesc->vt;
           if (SUCCEEDED(pTypeInfo->GetRefTypeInfo(hrt, &pUserTypeInfo)))
           {
             ITypeLib *pITypeLib;
             UINT nIndex = NULL;
             if (SUCCEEDED(pUserTypeInfo.p->GetContainingTypeLib(&pITypeLib, &nIndex)))
             {
               CComBSTR bStr = NULL;
               pITypeLib.p->GetDocumentation(nIndex, &bStr, NULL, NULL, NULL);
               if (bStr == "IFontDisp")
                 bStr = "Font";
               else if (bStr == "IPictureDisp")
                 bStr = "Picture";
               else
                 continue;
               CComVariant varVal;
               CComBSTR bstrVal;
         &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 如何从ITypeInfo接口返回类型信息

相关文章

  • 2017-06-05 这个问题如何用多线程解决?
  • 2017-06-04 如何用VC读取WORD文档内容的格式(字体、大小、颜色、粗体、下划线等)?
  • 2017-06-05 为什么hook有那么多问题,都不知道是怎么回事儿。
  • 2017-06-04 请问一个很基本的问题,但是我不懂
  • 2017-06-05 如何用installshield做VC程序的安装文件---肯请哪位仁兄指教?
  • 2017-06-04 IDispatch是个什么东西?我怎么老是在这个出错。
  • 2017-06-05 开了18个线程,每个线程内都有死循环,程序运行明显变慢?
  • 2017-06-04 关于activex的容器的问题
  • 2017-06-05 vs2010创建进程外com出错
  • 2017-06-04 IE没有调用FinalRelease??

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请问MFCAppWizarddll与Win32Dynamic-LinkLibrary有何区别?
    • 关于workerthreader的问题
    • 怎样检查DLL的内存泄漏
    • 控件运行问题?急~
    • 有关线程钩子
    • 求助:使用系统钩子截获所有键盘、鼠标消息
    • play,stop(的算法
    • 只有ah和xdll文件,在c++中怎么利用ah调用并且连接xdll中的函数急急急
    • 如何创建一个ActiveX控件使其成为一个可以容纳其他OLE对象的容器
    • dll中的对话框内ocx控件不能显示,如何解决?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有