gpt4 book ai didi

multithreading - 防止 Delphi MDI 应用程序在外部 DLL 中创建 TApplication

转载 作者:行者123 更新时间:2023-12-03 15:55:08 24 4
gpt4 key购买 nike

这就是问题(剩下的只是为了让你可以告诉我我做错了)

有什么方法可以确保要运行的第一个二进制文件(即我的可执行文件)是第一个初始化 vcl.controls.pas 的文件?

<小时/>

我问this question a few months ago我想出了如何修复它,并且同步再次工作,只是在 Delphi 2009 中变得更好。

现在我们有了 Delphi XE2 并且出现了同样的症状。 TThread.Synchronize 会锁定,直到系统空闲或将鼠标移到事件窗体上,导致程序运行速度超慢。我可以在 Delphi 2009 中重现这个问题,因为我很幸运,发现源代码是一个非迂回链接的 DLL,但我不相信 XE2 会出现这种情况。我不知道为什么 XE2 决定以与 Delphi 7 或 2009 不同的方式初始化代码,但根据我对另一个问题的回答,TThread 没有真正改变,所以它一定在其他地方。

嗯,我一直在逐步完成主 MDI 应用程序的初始化,它似乎在链接的 DLL 内调用 TApplication.Create(这发生在 VCL.Controls.pas 的初始化中)。我不能说我理解为什么这是一个问题,因为我使用相同的运行时包(VCL、RTL 等)构建所有内容。

最佳答案

我们也遇到了与您描述的相同的问题(尽管是在 C++ Builder 中)。似乎有三种可能的解决方案。

1) 从 DLL 中删除所有 VCL 依赖项。这是我的公司最终的发展方向,但短期内这可能不是很有帮助的建议。

2) 使用包而不是 DLL。这是我们从 Borland 支持部门得到的官方答案(很久以前)。显然,如果您创建一个包 (BPL) 而不是 DLL,它可以更好地确定 VCL 初始化。

3) 我不知道这第三种解决方案潜伏着什么隐藏问题,因为它是一个很黑客的方法,但以下是我目前如何在我们的系统上应用创可贴,直到我们可以从 DLL 中获取 VCL (而且它似乎有效)。

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
delete Application;
Application = new TApplication(NULL);

但我必须承认这让我有点紧张(而且让我感觉有点肮脏)。

我确信您可以将其转换为 Pascal,其想法是销毁由 DLL 创建并分配给 Application 全局变量的原始 TApplication 对象。然后在可执行文件的 WinMain 中创建您自己的 TApplication 对象,并将其分配给全局 Application 变量。只要在你有机会扔掉它之前没有任何东西存储了指向原始 TApplication 对象的指针,看起来应该没问题。

关于multithreading - 防止 Delphi MDI 应用程序在外部 DLL 中创建 TApplication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8804731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com