DLL在创建ADO对象时提供异常程序终止

时间:2013-10-16 09:26:23

标签: dll com ado c++builder

我有一些使用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);
}

1 个答案:

答案 0 :(得分:0)

我会引用Remy Lebeau:

  

COM基于每个线程进行初始化。一旦成为线程的COM模型   (公寓与多线程)已设置,以后不能更改。   如果你的DLL在调用者之前调用CoInitialize(),你的   参数将优先,这可能不符合调用者的   需要。如果您想在没有DM的情况下控制DM的COM设置   影响调用者,你必须将DM移动到他们自己的线程。   此外,DllEntryPoint()不适合初始化   无论如何他们。操作系统限制允许DllEntryPoint()执行的操作。

这解决了这个问题。在加载库之前,我不得不调用coInitialize()。