c# - 如何在 vb.net 中获取 OCX 的位置和文件名

标签 c# .net vb.net winapi ocx

我可以很好地加载控件(伪代码):

Set o = CreateObject("DevsoftCustom.CommControl")

现在,我需要找到该 ocx 的文件和目录(这样我就可以读取 ocx 上的版本标记,并从该目录中的配置文件中读取)。

这是如何在 C# 和 vb.net 中完成的? (本项目在vb.net中)

最佳答案

Now, I need to find the file and directory for that ocx

假设您没有使用私有(private) COM 注册,此类信息在注册表中。

HKCR\CLSID\<SOME-GUID>\LocalServer="<path>"

...或者:

HKCR\<PROG-ID>\CLSID=<GUID>  // use this GUID in the example above

或者,如果您不想使用注册表,您可以使用 native 函数 CLSIDFromProgID()Tell me more...

这是 OLE/COM Object ViewerMicrosoft Outlook Date Control 的简单表示.

You can use the OLE/COM Object Viewer to view a control's interfaces.

enter image description here

因此,在您的情况下,根据程序 ID "DevsoftCustom.CommControl"

在注册表中查找类 ID

  1. HKCR 下,查找 key DevsoftCustom.CommControl
  2. 会有一个名为CLSID的子键,注意默认值
  3. 打开 HKCR\CLSID\<your-key-from-step-2>
  4. 路径将位于名为 LocalServer32 的子项中

使用 Office 示例:

enter image description here

一旦了解了 COM 的工作原理,就可以轻松地在 C# 中实现上述内容。

Isn't there a more direct way to ask the OS based on the object/control name?

据我所知,正如 Damien 所提到的,COM(包括 OCX)的要点是您不关心某物在哪里,您只需要一个实例。

最接近的相似之处是在 GAC 中有一个 .NET 程序集,您希望在其中创建一个对象的实例,但又不想担心在同一台计算机上一遍又一遍地部署相同的程序集。当然,GAC 的用途远不止于此,因此比较就此结束。

关于c# - 如何在 vb.net 中获取 OCX 的位置和文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32754027/

相关文章:

c# - 基类未反序列化

c# - ASP.NET MVC4 Web API 接口(interface)作为数据契约

c# - 将图像从 Url 异步加载到 PictureBox

VB.NET如何连续读取TCP流

xml - 订购不超过 10 件商品

c# - 遗留代码 visual basic to c#

C#静态接口(interface)或抽象实现

c# - 如何从 CRM 中获取超过 5000 个实体

c# - 从 C# 在 PowerShell 6 中运行 PowerShell 脚本

C#:如何从资源文件加载游标?