加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 是否可以启动(并停止)DLL中的线程?

发布时间:2020-12-15 09:38:08 所属栏目:大数据 来源:网络整理
导读:我正在考虑为我做的一些常见事情构建DLL的一些想法.有一件事我想检查是否有可能在DLL中运行一个线程.我确信我至少可以启动它,并在终止时自动释放它(并强制终止它自己) – 我可以看到这不会是一个大问题.但是一旦我开始它,我不知道如何继续与它通信(特别是为
我正在考虑为我做的一些常见事情构建DLL的一些想法.有一件事我想检查是否有可能在DLL中运行一个线程.我确信我至少可以启动它,并在终止时自动释放它(并强制终止它自己) – 我可以看到这不会是一个大问题.但是一旦我开始它,我不知道如何继续与它通信(特别是为了阻止它)主要是因为每次调用DLL都是唯一的(据我的知识告诉我)但我也知道很少学科.

我已经看到在某些情况下,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的次数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读