0

我有一些使用 C++ Builder 6 创建的数据模块。它们中的每一个都使用另一个数据模块来初始化与数据库的连接。我正在尝试用这些数据模块制作一个 DLL。

创建 DataModule_Users 时引发错误并显示“程序异常终止”。

我哪里错了?

提前致谢

数据模块_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

数据模块_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);
}
4

1 回答 1

0

我将引用 Remy Lebeau:

COM 在每个线程的基础上进行初始化。一旦设置了线程的 COM 模型(公寓与多线程),以后就无法更改。如果您的 DLL 在调用者之前调用 CoInitialize(),则您的参数将具有优先权,这可能无法满足调用者的需求。如果您想在不影响调用者的情况下控制 DM 的 COM 设置,则必须将 DM 移动到它们自己的线程中。此外,无论如何,DllEntryPoint() 都不适合初始化它们。操作系统限制了 DllEntryPoint() 可以做什么。

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

于 2014-02-18T12:19:26.553 回答