如何在 .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 接口的指针并查询它。
我正在访问 .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 接口的指针并查询它。