delphi – 是否可以启动(并停止)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中的函数. 句柄后面是DLL需要跟踪调用之间的任何状态.从EXE的角度来看,这个手柄是不透明的. 即使使用像C这样的非OOP语言,这种模式也可以正常工作.但是,使用OOP工具要容易得多.由于您希望跨越模块边界,因此使用接口而不是Delphi对象会更安全.如果跨模块边界传递Delphi对象,则只能传递对象的数据部分,而不能传递代码部分. 使用接口时,DLL返回的接口变量将作为上面编号列表中的句柄.它包含任何实例数据.接口的使用允许随时可扩展. 至于线程部分,最好使用更高级别的线程库而不是原始线程.我推荐的图书馆是Primo?Gabrijel?i?的OmniThreadLibrary. 关于你的编辑:
将DLL加载到进程中时,只有一个实例.特别是如果您打算使用全局变量,那么每个全局变量只有一个实例,而不管您调用LoadLibrary的次数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |