gpt4 book ai didi

c# - CSharp 引用在 Delphi XE2 中编译的 x64 OCX

转载 作者:太空宇宙 更新时间:2023-11-03 20:10:53 24 4
gpt4 key购买 nike

当引用在 Delphi XE2 中编译的 x64 OCX 时,我的 C# 项目出现问题。 OCX 位于并注册在 system32 目录中。但是,当我尝试使用 Visual Studio 2010 引用它时,它没有在浏览引用窗口中列出,除非我将 OCX 移动到另一个目录,例如 c:\test\,然后它会显示出来。

当我将 x32 版本的 OCX 复制到 syswow64 目录时,没有在此目录中注册,然后 IDE 将它列在浏览引用窗口中。但是当我尝试实例化类时,出现以下异常:

System.Runtime.InteropServices.COMException was unhandled Message=Retrieving the COM class factory for component with CLSID {58465503-4991-4578-8478-FF7A6CBAA8CE} failed due to the following error: 80040111 ClassFactory cannot supply requested class (Exception from HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)). Source=mscorlib ErrorCode=-2147221231

当我使用另一个目录如 c:\test\并在那里注册 OCX,并在我的项目中引用并实例化它时,一切正常。

我不知道是什么导致了这个问题,是 IDE 错误还是 OCX 中的问题。 OCX、x32 和 x64 都有不同的 UID。

有人知道会发生什么吗?

谢谢

编辑:IDE 是 x32

最佳答案

有点不清楚这里究竟发生了什么。但这是我的想法:

  1. Visual Studio IDE 是 32 位的。因此,如果您想让它看到您需要注册 32 位版本的组件。
  2. 您说“OCX,x32 和 x64,都有不同的 GUID”。那是个错误。 COM 注册表使用注册表重定向器来处理位数。您的组件必须对 32 位和 64 位版本使用相同的 GUID。
  3. 请停止在系统目录中放置文件。这不是你的。它属于系统。

我的猜测是您正在让 IDE 识别组件的 32 位版本。您正在导入类型库,VS 正在为您的组件制作 COM 包装器。这将使用您为 32 位组件定义的 GUID。然后您尝试构建组件的 64 位版本,但编译器使用的是 32 位 GUID。当您运行它时,系统无法找到该组件,因为没有使用 32 位 GUID 注册的 64 位组件。

如果这个假设是准确的,那么您可以通过对组件的所有版本使用相同的 GUID 来解决您的问题。

关于c# - CSharp 引用在 Delphi XE2 中编译的 x64 OCX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com