在打开 TFDConnection->Open() 后的空项目中,程序完成后与 Mongodb 的连接崩溃错误“蓝牙:无法清理 Winsock”。
1 回答
此错误似乎发生在 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() 不会返回错误,并且应用程序可以关闭。