如何在 .Net 中获取 com 对象控件的名称?

How to get name of the com object control in .Net?

我正在访问 .net 应用程序中的 COM 对象。 我想获取在设计时提供的此 COM 对象的名称。

我用谷歌搜索了一下,了解到获取名称的方法是通过 GetTypeInfo api。但是不知道怎么用。

有人可以提出解决方案吗?

GetTypeInfo 是 IDispatch 接口中的函数,因此您的 COM 对象必须支持 IDispatch。 首先,您应该调用 GetTypeInfoCount 以查看组件是否提供类型信息。如果它 returns 0,则它不会。

如果是,只需调用 comObject.GetTypeInfo(0, 0, pointer)。第一个参数标识你在问什么,0 表示 "about the component"。第二个参数是 localeID,您可以从 Kernel32.dll 中获取它,但使用 0 是美国英语的默认值。 thid 是一个输出参数,该函数将指针指向您要查找的 ITypeInfo。

获得 ITypeInfo 后,要获取名称,您还需要获取其文档 (GetDocumentation),最后,文档具有名称(以及帮助文件和帮助上下文)。

所有这些都记录在 MSDN 中,搜索我在这里提到的函数以获取详细信息

我终于可以完成这项工作了。以下是我在设计时从 COM 对象获取分配给控件的名称所遵循的步骤:

 “名称”属性 不能直接在 IDispatch 界面上使用

  • 在 COM 对象上使用 IDispatch 接口,我们可以调用标准属性和方法。使用它,我们能够检索 HWND、字体等属性,但我们无法检索名称 属性.

 了解扩展器属性

  • 控件的一些属性是由容器而不是控件提供的;这些是扩展属性。扩展器属性的示例是:名称、标记和左。控件仍然需要知道这些扩展器属性的值是什么,有时需要能够更改一个扩展器属性; Extender 对象授予控件访问这些属性的权限。

 现在,下一个挑战是从可用的 COM 对象中获取扩展对象。

  • COM 对象实现了一些标准的 OLE 接口。因此,使用这些接口,我们可以检索扩展器对象。下面列出了 COM 对象可用接口的详细信息 link.
  • 检索扩展对象不是直接步骤。为此,

    首先,我们需要获取指向控件上IOleObject 接口的指针。这可以使用 QueryInterface API 检索。

    使用 IOleObject 指针,我们必须获取与控件关联的 ClientSite。这可以使用 IOleObject 接口上可用的 GetClientSite API 来实现。 returns 指向 IOleClientSite 接口的指针。

    从 IOleClientSite 接口指针,我们必须检索 ControlSite。这是通过在其上查询 IOleControlSite 接口来实现的。 returns 指向 IOleControlSite 接口的指针。

    可以使用 IOleControlSite 接口使用 GetExtendedControl API 获取扩展对象。

    要访问扩展程序控制对象上的名称 属性,我们必须获取指向 IDispatch 接口的指针并查询它。