将TFDConnection设置为MongoDB

时间:2016-01-21 12:15:33

标签: mongodb firedac c++builder-10-seattle

在打开TFDConnection-> Open()之后的空项目中,程序完成后与Mongodb的连接崩溃错误'蓝牙:无法清理Winsock'。

1 个答案:

答案 0 :(得分:0)

在System.Win.Bluetooth中的TWinBluetoothSocket.Destroy例程期间出现此错误。出于某种原因,即使没有使用蓝牙,也会在C ++应用程序中调用TWinBluetoothSocket析构函数。

问题是TWinBluetoothSocket析构函数正在调用WSACleanup(),但从未调用过WSAStartup(),因此WSACleanup()返回错误。

当在C ++应用程序中使用Mongo驱动程序时会发生这种情况,即使TFDConnection位于Delphi单元中,只要选择了Mongo驱动程序并且在设计或运行时将Connected设置为true即可。

重现这一点不需要MongoDB服务器;只需在按钮单击处理程序中将Connected设置为true即可。当然,由于没有MongoDB服务器会发生错误,但是当应用程序退出时会发生此错误。

解决方法是将它放在构造函数中(来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms742213(v=vs.85).aspx

WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
  {
     ShowMessage("err nonzero"); 
  }

现在,调用WSAStartup(),因此WSACleanup()不会返回错误,应用程序可以关闭。