我正在尝试创建一个包含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的内容,但这似乎没有任何区别。
有什么想法吗?
由于
答案 0 :(得分:0)
你根本不应该在你的DllEntryPoint()
做很多工作。无论如何,当然不会打电话给CoInitialize()
。加载时调用它不是DLL的责任。在加载DLL之前,它是调用应用程序的责任。
你应该:
导出一个额外的函数来初始化你的DLL,然后在加载DLL后得到它(同样是为了在卸载之前取消初始化DLL)
在DLL第一次真正需要它们之前,不要创建TForm / TDataModule。
将您的TForm / TDataModule移动到DLL内部的工作线程中。在这种情况下,您可以拨打CoIniitalize()
。
在所有情况下,不要在DLL的Application
对象上进行中继以管理TForm / TDataModule的生命周期。在卸载DLL之前,请自己释放它们。