代码之家  ›  专栏  ›  技术社区  ›  dummzeuch Stijn Sanders

我可以将接口(接口)传递给DLL吗?

  •  0
  • dummzeuch Stijn Sanders  · 技术社区  · 14 年前

    我有一个DLL和一个程序,都是用Delphi2007编写的。程序传递一个接口,该接口从IInterface下降,并且没有guid(因此这里没有com)到保存该接口以供以后使用的dll。

    这看起来工作得很好,但有时当程序关闭并卸载dll时,我会遇到访问冲突。我不确定这些AVS的原因。接口可能会超出作用域,并且通过引用计数位于程序上下文中的底层对象而释放,从而导致内存损坏,因为涉及两个不同的内存管理器。

    我不使用sharemem,也不想因为各种原因使用它(一个原因是有其他程序不是用delphi编写的,可能需要使用该dll)。

    我知道我不应该以这种方式传递字符串、开放数组和对象,但是接口应该工作吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Lars Truijens    14 年前

    是的,如果都是德尔菲的话,那就可以了。如果接口发生变化,您必须确保编译这两个函数。C++编译器看起来是兼容的,但是要注意其他编译器。

    通常,引用计数达到零会导致对象的创建者释放它。在不同的内存管理器中没有问题。

    可能的问题是,您的dll仍然通过接口引用一个对象,并调用iunknown.release以在不再需要时降低引用计数。如果由于某种原因,引用的对象已经被冻结,您将得到AVS。关闭应用程序之前,请确保通过引用删除对对象的所有引用(双击全局变量)。

    fastmm的调试选项可能会帮助您找到问题所在。

        2
  •  0
  •   Rob Kennedy    14 年前

    在DLL之间传递接口没有任何问题。毕竟,每次使用来自WindowsAPI的接口时,都是这样。因此,你的问题就更深了。

    缺少guid是一个需要解决的简单问题。只需按ctrl+shift+g,就可以使用com了。Delphi中所有与界面相关的东西在界面有guid时变得更容易,即使你不使用com。

    如果您的dll是一个COM dll,那么主机程序将能够检查卸载该dll是否安全。Delphi的COM框架自动跟踪该dll中是否还有活动的对象。当主机希望卸载dll时,它会询问dll是否安全。

    您的对象应该是COM对象。宿主程序将使用OS标准创建对象的实例 CoCreateInstance 函数,使用对象的GUID。您的dll将已经在操作系统中注册,因此 共同创造 将知道自动加载您的dll并调用其中的正确函数来实例化您的类。(如果你也在写主机,那就用Delphi's吧 CreateComObject 而不是函数。)