从 64 位代码访问 32 位 DLL

2023-11-30

我需要迁移 32 位 dll 以便在 64 位 C#(以及 C++)应用程序中使用它。该dll是用非托管delphi代码编写的。我无法重新编译 dll,唯一的方法是使用进程间通信 (IPC)。我搜索了很长时间,但没有找到太多相关信息。我找到的最好的指南是在这个链接中:从 64 位代码访问 32 位 DLL.

我遵循本指南来实现我的目标,因为这个论坛中经常引用它。所以指南解释说我必须采取三个步骤:

第 1 步 - 创建一个实现 COM 对象的 32 位组件,该对象加载并调用 32 位 DLL,并将 32 位 DLL 接口公开为 COM 接口。所以我按照解释做了同样的事情here(示例取自之前的链接):

[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IGetMyString
{
   string GetMyString();
}

[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")]
[ProgId("CallPDW.Class1")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : IGetMyString
{
    string GetMyString()
    {
      ......
    }
}

然后我必须注册 .NET COM 程序集,因此我必须使用 Regasm.exe,但我创建了 Visual Studio 安装和部署项目,该项目构建 MSI 文件并进行与 Regasm 相同的操作。然后我控制了注册表编辑器,找到了 HKEY,这样它就可以工作了。 所以直到这一步一切都好或者看起来都好。

第 2 步 - 通过创建标准 COM+ OOP 应用程序(使用 dllhost 作为代理进程),将此 COM 组件配置为进程外 (OOP);

第 3 步 - 创建一个 64 位包装 DLL,它实现与 原始32位DLL,导入上面创建的COM对象的COM接口, 将对公开接口的当前调用转换为对 COM 对象接口的调用,传输调用参数,接收返回值和委托 他们给来电者;

问题是 2° 和 3° 步骤我不知道如何实现,因为我在网络或论坛中没有找到任何关于此的信息。所以我需要帮助来实现步骤 2° 和 3°。也可以一些其他帖子的链接等。 提前致谢。


其他信息(2016 年 10 月 12 日 - 晚上 11:10): 该 DLL 通过两个接口将其函数公开给 32 位本机环境: 1.) 带有函数指针的 C/C++ 标头 (WINAPI*) 2.) 带有 P/Invoke 的 .NET 接口


你走在正确的轨道上。您已经创建并注册了一个 COM 可见包装 DLL,这是公开 Delphi 库的方法所必需的。

由于您的 x64 进程无法调用此 x86 包装器,因此需要代理进程。然而,将 DLL 转换为成熟的 DLL 没有什么意义。COM+服务器,如果您不打算使用其任何服务。

相反,我建议将包装器 DLL 托管到默认的 COM 代理项中。为此,请调用基于 x86 的 OLE/COM 对象查看器,它是 Windows SDK 的一部分。展开“所有对象”节点并选择 COM 可见类。从那里,切换到“实施”选项卡并选中“使用代理进程”。切换到“注册表”选项卡并确认“AppID”节点现在包含[DllSurrogate]入口。注意:如果您需要自动执行此步骤,则需要手动或通过设置过程自行将适当的值写入注册表。

您现在应该能够从 x64 主机创建 COM 可见包装类的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 64 位代码访问 32 位 DLL 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐