Установка TFDConnection для MongoDB

В пустом проекте после открытия TFDConnection->Open() при подключении к Mongodb по завершении программы вылетает ошибка "Bluetooth: невозможно очистить Winsock".

1 ответ

Эта ошибка возникает во время процедуры TWinBluetoothSocket.Destroy в System.Win.Bluetooth. По какой-то причине деструктор TWinBluetoothSocket вызывается в приложении C++, даже если Bluetooth не используется.

Проблема в том, что WSACleanup() вызывается деструктором TWinBluetoothSocket, но WSAStartup() никогда не вызывался, поэтому WSACleanup() возвращает ошибку.

Это происходит, когда драйвер Mongo используется в приложении C++, даже когда TFDConnection находится в модуле Delphi, если выбран драйвер Mongo и для свойства Connected установлено значение true в проекте или во время выполнения.

Сервер MongoDB не требуется для воспроизведения этого; просто установите для параметра Подключено значение 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() не возвращает ошибку, и приложение может закрыться.

Другие вопросы по тегам