0

我正在尝试创建一个包含 VCL 数据模块的 dll - 想法是各种应用程序都可以加载相同的 dll 并使用相同的数据库代码。

数据模块本身作为应用程序的一部分经过测试可以正常 - 我已将表单复制到我的 dll 项目中。

所以在dll入口点方法中,我需要初始化数据模块:

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    //if I don't call this, I get an exception on initializing the data module
    CoInitialize(NULL);

    //initialize a standard VCL form; seems to works fine
    //I'm not using Application->CreateForm as I don't want the form to appear straight away
    if(!MyForm) MyForm = new TMyForm(Application);

    //this doesn't work - the thread seems to hang in the TDataModule base constructor?
    //I've also tried Application->CreateForm; same result
    if(!MyDataModule) MyDataModule = new TMyDataModule(Application);

}

我还看到了一些关于在创建表单之前我需要如何调用 Application->Initialize 的信息,但这似乎没有任何区别。

有任何想法吗?

谢谢

4

1 回答 1

0

你真的不应该在你身上做太多的工作DllEntryPoint()CoInitialize()无论如何,当然不会打电话。加载时调用它不是 DLL 的责任。在加载 DLL 之前,这是调用应用程序的责任。

您应该:

  1. 导出一个附加函数来初始化您的 DLL,然后在加载 DLL 后使用应用程序(在卸载之前取消初始化 DLL 也是如此)

  2. 在 DLL 第一次真正需要它们之前,不要创建 TForm/TDataModule。

  3. 将您的 TForm/TDataModule 移动到 DLL 中它们自己的工作线程中。在这种情况下,您将调用CoIniitalize().

在所有情况下,不要依赖 DLL 的Application对象来管理 TForm/TDataModule 的生命周期。而是在卸载 DLL 之前自行释放它们。

于 2013-02-27T23:06:20.427 回答