我将一些代码从Qt 5.6.0迁移到了均由Visual Studio 2015编译的Qt 5.12.0。它的某些代码使用QtBluetooth
用于常规(无“低能耗”)蓝牙。在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文件。 QtBluetooth.dll
的Dependency Walker报告这些库丢失。
我使用Qt 5.12.0进行了尝试,都编译了我的selft文件,并作为QtCreator
安装的一部分进行了下载。我尝试了Windows 7和Windows 10,Windows 10可以正常运行。总是收到此错误,我没有找到有关在何处找到这些库或如何使QtBluetooth
不使用它们的信息。
要在Windows下简单运行基于QtBluetooth
的应用程序,我应该怎么做?
编辑:提交的Qt错误:https://bugreports.qt.io/browse/QTBUG-73272
答案 0 :(得分:0)
如果您不需要低能耗并且可以打扰用户使用Windows系统设置对话框来配对设备,那么我建议为不使用QtBluetooth的Windows编写包装代码。即
#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);
}
}