C ++ Builder XE2:在dll中初始化数据模块

时间:2013-02-27 11:04:50

标签: c++ dll c++builder vcl datamodule

我正在尝试创建一个包含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的内容,但这似乎没有任何区别。

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

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

你应该:

  1. 导出一个额外的函数来初始化你的DLL,然后在加载DLL后得到它(同样是为了在卸载之前取消初始化DLL)

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

  3. 将您的TForm / TDataModule移动到DLL内部的工作线程中。在这种情况下,您可以拨打CoIniitalize()

  4. 在所有情况下,不要在DLL的Application对象上进行中继以管理TForm / TDataModule的生命周期。在卸载DLL之前,请自己释放它们。