我有几个使用C ++ Builder 6创建的数据模块。每个模块都使用另一个数据模块来初始化与数据库的连接。我正在尝试从这些数据模块中制作一个DLL。
该错误在创建DataModule_Users时引发,并显示“程序异常终止”。
我哪里出问题了?
提前致谢
datamodule_dll.bpf
USEFORM("DataModule_Connection.cpp", DataModule_Connection); /* TDataModule: File Type */
USEFORM("DataModule_Users.cpp", DataModule_Users); /*TDataModule: File Type */
//------------------------------------------------------------------
This file is used by the project manager only and should be treated like the project file
DllEntryPoint
datamodule_DLL.cpp
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
extern "C" __declspec(dllexport) const char * GetUserName(const char * ID);
const char * GetUserName(const char * ID) {
CoInitialize(NULL); // datasets use COM
// This is used by DataModule_Users (normally this is done with Application->CreateForm();
DataModule_Connection = new DataModule_Connection( 0 /* Owner */ );
DataModule_Users = new DataModule_Users( 0 /* Owner */ );
return DataModule_Users->GetUserName(ID);
}
我会引用雷米·勒博(Remy Lebeau)的话:
COM是在每个线程的基础上初始化的。一旦设置了线程的COM模型(公寓式还是多线程式),以后就无法更改。如果您的DLL在调用者之前调用CoInitialize(),则您的参数将具有优先级,这可能无法满足调用者的需求。如果要控制DM的COM设置而不影响调用者,则必须将DM移动到它们自己的线程中。此外,无论如何,DllEntryPoint()并不是初始化它们的适当位置。操作系统限制了DllEntryPoint()可以执行的操作。
这解决了问题。在加载库之前,我必须调用coInitialize()。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句