Не удается загрузить QtBluetooth 5.12.0 под Windows 7 - PullRequest
0 голосов
/ 25 января 2019

Я перенес некоторый код из Qt 5.6.0 в Qt 5.12.0, оба скомпилированные с Visual Studio 2015. В нем есть код, использующий QtBluetooth для обычного (без «малой энергии») Bluetooth. С 5.6.0 это работало идеально.

С Qt 5.12.0 мое приложение не загружается. Он сообщает о пропавших без вести API-MS-WIN-CORE-WINRT-L1-1-0.DLL и API-MS-WIN-CORE-WINRT-STRING-L1-1-0.DLL. Я не понимаю, зачем нужны эти файлы WinRT. Dependency Walker для QtBluetooth.dll сообщает, что эти библиотеки отсутствуют.

Я попробовал оба с Qt 5.12.0, скомпилировал свой selft и скачал как часть QtCreator установки. Я пробовал как Windows 7, так и 10, Windows 10 работает шустро. Всегда получаю эту ошибку, и я не нашел информации о том, где найти эти библиотеки или как QtBluetooth не использовать их.

Что мне нужно сделать, чтобы просто запустить приложение на базе QtBluetooth под Windows?

Редактировать: Отправленная ошибка Qt: https://bugreports.qt.io/browse/QTBUG-73272

1 Ответ

0 голосов
/ 26 января 2019

Если вы не нуждаетесь в низком энергопотреблении и можете мешать пользователям подключать устройство с помощью диалогового окна настроек системы Windows, то я бы порекомендовал написать код-обертку для окон, которые не используют QtBluetooth. * 1001 Т.е. *

#include <Windows.h>

class win_con {
    ....

    HANDLE hcon;
    COMMTIMEOUTS *timeouts;

    // i.e. com_port = L"\\\\.\\COM1"; 
    void open_com(std::wstring com_port, int read_timeout, int write_timeout)
    {

        hcom = CreateFile(com_port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, 
            OPEN_EXISTING, 0, nullptr);
        if (hcom == INVALID_HANDLE_VALUE) ...

        timeouts = new COMMTIMEOUTS();
        memset(timeouts, 0, sizeof(COMMTIMEOUTS));
        timeouts->ReadTotalTimeoutConstant = read_timeout;
        timeouts->WriteTotalTimeoutConstant = write_timeout;
        if (!SetCommTimeouts(hcom, timeouts)) ...

    }

    void write_data(QString data)
    {
        std::string stddata = data.toStdString();
        DWORD numwritten = 0;
        if (!WriteFile(hcom, stddata.c_str(),
                static_cast<DWORD>(stddata.length()), &numwritten, nullptr)) {
            ...
        }
    }

    QString read_data(int len)
    {
        #define BUFFER_SIZE 256
        char buffer[BUFFER_SIZE];
        DWORD data_read = 0;
        if (BUFFER_SIZE < len) ....
        for (int i = 0; i < BUFFER_SIZE; i++)
            buffer[i] = 0;

        ReadFile(hcom, &buffer, len, &data_read, nullptr);

        if (read == 0) ...
        if (read < len) ...

        return QString(buffer);
    }
}
...