【问题标题】:C++ Builder XE2: Initializing a Data Module in a dllC++ Builder XE2:在 dll 中初始化数据模块
【发布时间】:2013-02-27 11:04:49
【问题描述】:

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

有什么想法吗?

谢谢

【问题讨论】:

  • 这可能相关也可能不相关:我可以初始化一个空的数据模块没问题。我的实际数据模块包含一个 ADOConnection 和一个 ADOQuery - 一旦我添加这些问题就开始了
  • 我在线程中使用 ADO 组件时遇到了类似的问题。它需要调用 CoInitialize。不知道这对您的情况是否有帮助,但请尝试..

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


【解决方案1】:

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

您应该:

  1. 导出一个额外的函数来初始化你的 DLL,然后在加载 DLL 后使用它(卸载之前取消初始化 DLL 也是如此)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多