无法连接Delphi XE3中内置的Com对象

无法连接Delphi XE3中内置的Com对象,delphi,com,activex,Delphi,Com,Activex,我们有一个具有内置com对象的Delphi应用程序。在Delphi XE3(Windows 8)中编译时,我们无法从Visual Studio C#中引用它。然而,在Delphi 2010(Windows 7)中编译的旧版本工作正常 com对象注册时没有错误,我可以使用Excel中的VBA脚本访问它。有人遇到过这样的事情吗?最有可能的解释是位错配。我假设COM服务器是32位的,因为您一直在Delphi2010中编译它 假设您的COM服务器是进程内服务器。那么我猜您的失败主机是一个64位应用程序。

我们有一个具有内置com对象的Delphi应用程序。在Delphi XE3(Windows 8)中编译时,我们无法从Visual Studio C#中引用它。然而,在Delphi 2010(Windows 7)中编译的旧版本工作正常


com对象注册时没有错误,我可以使用Excel中的VBA脚本访问它。有人遇到过这样的事情吗?

最有可能的解释是位错配。我假设COM服务器是32位的,因为您一直在Delphi2010中编译它

假设您的COM服务器是进程内服务器。那么我猜您的失败主机是一个64位应用程序。如果是这样的话,那么你需要使咬合匹配。最有可能的方法是通过将主机切换为32位,以x86为目标


如果COM服务器处于进程外,则问题在于注册,而不是可执行位匹配。它将在32位注册表视图中注册,但您的64位主机正在64位视图中查看。这将解释为什么32位Excel VBA代码可以找到它。您需要在32位和64位注册表视图中注册服务器。或者将主机切换到32位。

这非常有意义!Com服务器处于进程外,通过调用TComServer.UpdateRegistry(True)进行自注册。如何让它同时在32位和64位注册表视图中注册?如果您使用regserver手动注册它,它实际上在哪个注册表视图中注册?我根本不是这方面的专家。看起来您需要构建和注册32位和64位代理/存根DLL。如果您不使用代理,那么我想您可以在注册表的64位视图以及32位视图中注册exe。要做到这一点,您必须编写特殊代码。但首先要做的是将您的VS项目构建为32位,以证明这是问题所在。进程外应用程序(一个独立的exe文件)构建为32位,但在64位操作系统上编译。我还尝试在64位机器上使用C#访问它,操作系统是不相关的。重要的是服务器的比特度和客户端的比特度。您正在使用代理DLL吗?