Jer*_*dge 4 delphi dll delphi-7
我正在考虑为我做的一些常见事情构建DLL的一些想法.有一件事我想检查是否有可能在DLL中运行一个线程.我确信我至少可以启动它,并在终止时自动释放它(并强制终止它自己) - 我可以看到这不会是一个大问题.但是一旦我开始它,我不知道如何继续与它通信(特别是为了阻止它)主要是因为每次调用DLL都是唯一的(据我的知识告诉我)但我也知道很少学科.
我已经看到在某些情况下,DLL可以在开始时加载,并在不再需要时在最后发布.我对这种方法有0个知识或经验,除了看到与之相关的东西,甚至不能告诉你什么或如何,我不记得了.但这有可能吗?
我知道ActiveX/COM,但这不是我想要的 - 我只想要一个可以跨语言使用的基本DLL(特别是C#).
另外,如果有可能,那么我将如何从DLL到应用程序进行回调?例如,当我启动线程时,我很可能会将一个函数(在EXE中)分配为事件的处理程序(由DLL触发).
所以我想我要问的是 - 如何加载DLL以进行连续工作并在完成后释放它 - 而不是根据需要调用DLL中的单个函数的简单方法.在相同的情况下 - 我可能会在DLL中分配变量或创建对象.我怎样才能确保一旦我分配了该变量(或创建对象),我怎样才能确保下次调用DLL时变量或对象仍然可用?显然,它需要一种初始化/最终化DLL的机制(IE在加载DLL时在DLL内部创建对象,并在卸载DLL时释放对象).
编辑:最后,我将DLL包装在组件内部,所以当创建组件的实例时,将加载DLL并在DLL内部创建相应的线程,然后当组件被释放时, DLL已卸载.还需要确保如果存在这些组件中的2个,则将为每个组件加载2个DLL实例.
这与IInterface的使用有何关联?因为我也有0经验.
无需使用示例源代码直接回答 - 指向优秀教程的链接非常棒.
您正在寻找的基本模式如下:
句柄后面是DLL需要跟踪调用之间的任何状态.从EXE的角度来看,这个手柄是不透明的.
即使使用像C这样的非OOP语言,这种模式也可以正常工作.但是,使用OOP工具要容易得多.由于您希望跨越模块边界,因此使用接口而不是Delphi对象会更安全.如果跨模块边界传递Delphi对象,则只能传递对象的数据部分,而不能传递代码部分.
使用接口时,DLL返回的接口变量将作为上面编号列表中的句柄.它包含任何实例数据.接口的使用允许随时可扩展.
至于线程部分,最好使用更高级别的线程库而不是原始线程.我推荐的图书馆是PrimožGabrijelčič的OmniThreadLibrary.
关于你的编辑:
我将DLL包装在组件内部,因此当创建组件的实例时,将加载DLL并在DLL内部创建相应的线程,然后当组件被释放时,DLL被卸载.还需要确保如果存在这些组件中的2个,则将为每个组件加载2个DLL实例.
将DLL加载到进程中时,只有一个实例.特别是如果您打算使用全局变量,那么每个全局变量只有一个实例,而不管您调用多少次LoadLibrary.