从64位代码访问32位dll
本文关键字:32位 dll 访问 代码 64位 | 更新日期: 2023-09-27 18:12:11
我需要迁移一个32位的dll以便在64位的c#(以及c++)应用程序中使用它。dll是用非托管delphi代码编写的。我不能重新编译dll,唯一的方法是使用进程间通信(IPC)。我找了很长时间,但我没有找到很多信息。我找到的最好的指南在这个链接中:从64位代码访问32位dll。
我遵循这个指南来实现我的目标,因为这个论坛经常引用这个指南。所以指南解释说我必须做三个步骤:
1°STEP -创建一个32位组件,实现一个COM对象,该对象加载并调用32位DLL,并将32位DLL接口公开为COM接口。所以我做了同样的事情,在这里解释(从前面的链接的例子):
[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°STEP -通过创建一个标准的COM+ OOP应用程序(使用dllhost作为代理进程)为进程外(OOP)配置此COM组件;
3°STEP -创建一个64位封装器DLL,实现与原始的32位DLL,导入上面创建的COM对象的COM接口,将当前对公开接口的调用转换为对COM对象接口的调用,传输调用参数,接收返回值和委托
问题是2°和3°步骤我不知道如何实现,因为我在网上或论坛上找不到任何关于这一点。所以我需要帮助实现步骤2°和3°。也可以链接到其他帖子等。提前谢谢。
其他信息(12/10/2016 - 11:10 PM):这个DLL通过两个接口将其函数暴露给32位本机环境:1)一个带有函数指针的C/c++头文件(WINAPI*)2.)一个带有P/Invoke的. net接口
你做对了。您已经创建并注册了一个COM可见包装器DLL,这是公开Delphi库的方法所必需的。
由于x64进程不能调用这个x86包装器,因此需要一个代理进程。但是,如果您不打算使用它的任何服务,那么将DLL转换为成熟的COM+
服务器就没有什么意义了。
相反,我建议将包装器DLL托管到默认的COM代理中。为此,调用基于x86的OLE/COM对象查看器,它是Windows SDK的一部分。展开"所有对象"节点并选择你的COM可见类。从那里,切换到"实现"选项卡,并选中"使用代理过程"。切换到"Registry"选项卡,确认"AppID"节点现在包含一个[DllSurrogate]
条目。注意:如果您需要自动执行此步骤,则需要自己将适当的值写入注册表,无论是手动还是通过您的设置过程。
您现在应该能够在x64主机上创建COM可见包装器类的实例。