
我已经看到在某些情况下,DLL可以在开始时加载,并在不再需要时在最后发布.我对这种方法有0个知识或经验,除了看到与之相关的东西,甚至不能告诉你什么或如何,我不记得了.但这有可能吗?
我知道ActiveX / COM,但这不是我想要的 – 我只想要一个可以跨语言使用的基本DLL(特别是C#).
另外,如果可能,那么我将如何从DLL到应用程序进行回调?例如,当我启动线程时,我很可能会将一个函数(在EXE中)分配为事件的处理程序(由DLL触发).
所以我想我要问的是 – 如何加载DLL以进行连续工作并在完成后释放它 – 而不是根据需要调用DLL中的单个函数的简单方法.在相同的情况下 – 我可能会在DLL中分配变量或创建对象.我怎样才能确保一旦我分配了该变量(或创建对象),我怎样才能确保下次调用DLL时变量或对象仍然可用?显然,它需要一种初始化/最终化DLL的机制(I.E.在加载DLL时在DLL内创建对象,并在卸载DLL时释放对象).
编辑:最后,我将DLL包装在组件内部,所以当创建组件的实例时,将加载DLL并在DLL内部创建相应的线程,然后当组件被释放时,DLL已卸载.还需要确保如果存在这些组件中的2个,则将为每个组件加载2个DLL实例.
这与IInterface的使用有何关联?因为我也有0经验.
无需使用示例源代码直接回答 – 指向优秀教程的链接非常棒.
解决方法 您正在寻找的基本模式如下:> EXE调用DLL中的函数.
> EXE根据需要传递参数.
> DLL执行工作,启动线程,返回句柄.并且通过句柄我的意思是松散的工作意义而不是意味着Windows句柄.
> EXE现在可以通过调用更多函数,传递句柄来进一步与DLL通信.
> DLL可以与EXE通信,例如通过回调,只要EXE提供了回调.
>当需要停止时,EXE调用DLL函数,传递句柄.此时DLL整理了一下.
句柄后面是DLL需要跟踪调用之间的任何状态.从EXE的角度来看,这个手柄是不透明的.
即使使用像C这样的非OOP语言,这种模式也可以正常工作.但是,使用OOP工具要容易得多.由于您希望跨越模块边界,因此使用接口而不是Delphi对象会更安全.如果跨模块边界传递Delphi对象,则只能传递对象的数据部分,而不能传递代码部分.
使用接口时,DLL返回的接口变量将作为上面编号列表中的句柄.它包含任何实例数据.接口的使用允许随时可扩展.
至于线程部分,最好使用更高级别的线程库而不是原始线程.我推荐的图书馆是PrimožGabrijelčič的OmniThreadLibrary.
关于你的编辑:
I will wrap the DLL insIDe of a component,so when an instance of the component is created,DLL will be loaded and a corresponding thread will be created insIDe the DLL,then when the component is free’d,the DLL is unloaded. Also need to make sure that if there are for example 2 of these components,that there will be 2 instances of the DLL loaded for each component.
将DLL加载到进程中时,只有一个实例.特别是如果您打算使用全局变量,那么每个全局变量只有一个实例,而不管您调用Loadlibrary的次数.
总结以上是内存溢出为你收集整理的delphi – 是否可以启动(并停止)DLL中的线程?全部内容,希望文章能够帮你解决delphi – 是否可以启动(并停止)DLL中的线程?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)