【发布时间】:2016-04-27 16:29:19
【问题描述】:
在打开TFDConnection->Open()后的空项目中,程序完成后与Mongodb的连接崩溃错误“蓝牙:无法清理Winsock”。
【问题讨论】:
标签: mongodb firedac c++builder-10-seattle
在打开TFDConnection->Open()后的空项目中,程序完成后与Mongodb的连接崩溃错误“蓝牙:无法清理Winsock”。
【问题讨论】:
标签: mongodb firedac c++builder-10-seattle
此错误似乎发生在 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() 不会返回错误,并且应用程序可以关闭。
【讨论】: