首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何获取COM对象的类型

如何获取COM对象的类型
EN

Stack Overflow用户
提问于 2009-09-15 20:51:04
回答 4查看 19.7K关注 0票数 31

我引用的是Visual Studio中的COM库,因此它会自动为我创建相应的Interop程序集。我想对这些com对象执行GetType(),但它们总是返回System.__ComObject。不过,向它们查询接口是可行的:

代码语言:javascript
复制
bool isOfType = someComeObject is ISomeComObject; //this works

但我真正想要的是返回com对象的实际类型:

代码语言:javascript
复制
Type type = someComeObject.GetType(); //returns System.__ComObject :-(

有谁知道怎么做我想做的事吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-15 20:56:38

添加对Microsoft.VisualBasic.dll的引用,然后:

代码语言:javascript
复制
Microsoft.VisualBasic.Information.TypeName(someCOMObject)

MSDN参考here

票数 60
EN

Stack Overflow用户

发布于 2017-09-08 15:44:46

Darin接受的答案要求依赖于Microsoft.VisualBasic.dll。如果你不想这样做,你可以使用这个简单的助手类:

代码语言:javascript
复制
public static class TypeInformation
{
    public static string GetTypeName(object comObject)
    {
        var dispatch = comObject as IDispatch;

        if (dispatch == null)
        {
            return null;
        }

        var pTypeInfo = dispatch.GetTypeInfo(0, 1033);

        string pBstrName;
        string pBstrDocString;
        int pdwHelpContext;
        string pBstrHelpFile;
        pTypeInfo.GetDocumentation(
            -1, 
            out pBstrName, 
            out pBstrDocString, 
            out pdwHelpContext, 
            out pBstrHelpFile);

        string str = pBstrName;
        if (str[0] == 95)
        {
            // remove leading '_'
            str = str.Substring(1);
        }

        return str;
    }

    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("00020400-0000-0000-C000-000000000046")]
    private interface IDispatch
    {
        int GetTypeInfoCount();

        [return: MarshalAs(UnmanagedType.Interface)]
        ITypeInfo GetTypeInfo(
            [In, MarshalAs(UnmanagedType.U4)] int iTInfo,
            [In, MarshalAs(UnmanagedType.U4)] int lcid);

        void GetIDsOfNames(
            [In] ref Guid riid,
            [In, MarshalAs(UnmanagedType.LPArray)] string[] rgszNames,
            [In, MarshalAs(UnmanagedType.U4)] int cNames,
            [In, MarshalAs(UnmanagedType.U4)] int lcid,
            [Out, MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);
    }
}
票数 13
EN

Stack Overflow用户

发布于 2009-09-15 20:54:52

你基本上已经弄清楚了。COM对象上的GetType()将为您提供System.__ComObject,您必须尝试将其强制转换为其他对象,以查看该对象到底是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1429548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档