今天有一个奇怪的案例,这让我想到了delphi中的对象模型是如何工作的。
案例:
我们已经导入了一个SOAP服务,该服务公开了几个方法,将对象作为参数。 Delphi生成用于与soap服务通信的类/接口,用作参数的对象都从TRemotable继承。
出于不同的原因,我们已将所有与soap服务的通信放入dll中。
然后我们尝试实例化应该在主可执行文件中发送的对象,并将其传递给库以进行序列化和发送。
现在,这不起作用,但是我没想到会有例外。
它说我们尝试发送到soap服务的对象必须从TRemotable继承,但确实如此。通过检查对象,我们可以看到该类是来自wsdl的导入类,并且父类确实是TRemotable。
使用包构建解决了这个问题。
问题:
是否在源文件中定义的类(在两个库之间共享)最终在运行时作为不同的类?如果是这样,为什么会这样?
据我所知,在库之间传递对象应该没问题。那么,如何确保强类型,以及对象实例在多大程度上相互兼容?
答案 0 :(得分:3)
是的,不同DLL中的同一个类是不同的。每个DLL中的类将在运行时加载并指向不同的内存,因此即使对于相同的源文件,A.ClassType = B.ClassType
也会失败。您仍然可以传递对象并且它们将正常工作,除非在这种情况下它使用“是”或“as”来比较类本身。只有在编译DLL和主应用程序时编译器假定类匹配才能确保强类型。对于使用一个版本的对象和一个试图使用修改后的对象声明的较新应用程序加载DLL没有任何保护。如果你想要,你需要使用包。
答案 1 :(得分:0)
您可以尝试将参数作为TObject传递,并在任一端投射为TRemotable。我没有尝试过这种特殊情况,但我知道我已经将TObject传递给了这样的DLL。我也有类似的SOAP DLL,在我的情况下,这不起作用,因为我的SOAP DLL是用D2007 SOAP库编译的,并且出于复杂/遗留的原因,应用程序的其余部分是D2005。