系统:Windows 7 32位
语言:C++
我试图访问寄存器HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port 0,密钥Driver(类型REG_SZ) - 没问题.
例如,对于读取来说HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM,所有键(类型REG_SZ)都有斜线\Device\Serial0.
在读取这些键时,它总是返回2(没有这样的文件),并带有以下示例代码:
HKEY hKey = 0;
DWORD dwType = REG_SZ;
char buf[255] = {0};
DWORD dwBufSize = sizeof(buf);
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS )
{
auto ret = RegQueryValueEx( hKey, TEXT("\Device\Serial0"), 0, &dwType, (LPBYTE)buf, &dwBufSize );
// ret always == 2 for key with slashes
--- CUT ---
Run Code Online (Sandbox Code Playgroud)
使用名称中的斜杠读取键值的正确方法是什么?
我在使用变量而不是文本字符串时遇到了同样的问题.
我认为这两种方法都有单斜杠和双斜杠: …
问题:总是在Qt Creator 2.8.1 for Linux中选择调试或发布的地方评估CONFIG(调试,调试|发布)和CONFIG(发布,发布|发布).
我在Qt Creator应用程序中的配置(库存 - 新项目的默认值):
Projects->Build Settings->Debug Build Steps:
qmake build configuration: Debug
Effective qmake call: qmake2 proj.pro -r -spec linux-gnueabi-oe-g++ CONFIG+=debug
Projects->Build Settings->Release Build Steps:
qmake build configuration: Release
Effective qmake call: qmake2 proj.pro -r -spec linux-gnueabi-oe-g++
Run Code Online (Sandbox Code Playgroud)
我在proj.pro中的配置:
message(Variable CONFIG:)
message($$CONFIG)
CONFIG(debug,debug|release)
{
message(Debug build)
}
CONFIG(release,debug|release)
{
message(Release build)
}
Run Code Online (Sandbox Code Playgroud)
调试控制台上的输出:
Project MESSAGE: Variable CONFIG:
Project MESSAGE: lex yacc warn_on debug uic resources warn_on release incremental link_prl no_mocdepend release stl qt_no_framework debug console
Project …Run Code Online (Sandbox Code Playgroud) 我知道我无法在线程之间与 QTcpSocket 通信,但我找不到我做错了什么。
一旦我向另一个线程中的 QTcpSocket 发送数据发射信号,QSocketNotifier 应该禁用自身以让 QTcpSocket 读取数据。因为我遇到了上面的错误,所以它不会被禁用并且不会发出 readyRead() 信号。
我使用 QEventLoop 来实现阻塞机制(同步通信 - ModBus 协议)而不锁定主循环。我不能使用 waitReadyRead() 因为我过去在使用该函数时遇到了问题(超时):
https://bugreports.qt-project.org/browse/QTBUG-24451
和
https://bugreports.qt-project.org/browse/QTBUG-14975
有人可能会好奇为什么我要设置这么多线程:
Thread1:每次新的通信都会创建一个新线程,并用“全局”互斥锁将其锁定,以确保没有其他函数会执行并行通信。在该线程内 - 在准备和锁定互斥锁之后,我通过 Thread2 中的 Qt::QueuedConnection 信号(与设备的持续通信)与 QTcpSocket 通信。
Thread2:QTcpSocket 对象创建并移动到线程。一旦我连接到设备,我就不想关闭套接字。因为我阻塞了主事件循环,所以我需要其他事件循环来运行来自 QTcpSocket 的信号。
和代码:
void someFunctionThatWantToSendData( void ) // Main Thread
{
ElfKernel::KernelSingleton::Instance().getGUIcontrol()->getCtrlUnitPtr()->execModbusCommand( someParameters, someCommunicationFunction );
}
ElfKernel::FrameReceived ControlUnit::execModbusCommand( std::list<unsigned int> paramsToCommand, FunctionStringList execCommand ) // Main Thread
{
ModbusCommandReply* mcr = new ModbusCommandReply(); // THREAD_1!!!!!! this object run in a Thread -> ModbusCommandReply : public QThread …Run Code Online (Sandbox Code Playgroud) 我所有的源文件都是UTF-8转换的。
\n\n我打开的所有文件都是 UTF-8。
\n\n我的应用程序正在打开 UTF-8 编码文件,其中包含 3 种语言的翻译文本:英语、波兰语和俄语,并将数据保存到文件中,分为 3 个单独的编码块:Windows-1250(英语)、Windows-1250(波兰语)和Windows-1251(俄语)- 是的,没错,我在一个文件中混合编码类型,然后由知道如何处理该文件的第三方设备使用。
\n\nIv 得到了一个在 Qt4 下完美运行的测试程序,现在当我转移到 Qt5 时它停止运行(文本保存为 ?????????):
\n\n测试编码.cpp
\n\ntest_encoding::test_encoding(QWidget *parent) : QMainWindow(parent)\n{\n ui.setupUi(this);\n\n QString d;\n QFile f(QDir::currentPath() + "/input.txt");\n if( f.open( QIODevice::ReadOnly | QIODevice::Text ) )\n {\n d = f.readAll();\n f.close();\n }\n\n QFile ff(QDir::currentPath() + "/output.txt");\n if( ff.open( QIODevice::WriteOnly | QIODevice::Text ) )\n {\n QTextStream t(&ff);\n auto cutf8 = QTextCodec::codecForName("UTF-8");\n auto cw50 = QTextCodec::codecForName("windows-1250");\n auto cw51 = QTextCodec::codecForName("windows-1251");\n\n // ____Block 1\n t.setCodec(cutf8);\n t …Run Code Online (Sandbox Code Playgroud)从Qt 4.8切换到Qt 5.x时,您可能会注意到,每次保存XML文档时,它都会在文件内部产生随机的属性顺序。通过编程方式读取XML文档没有问题,因为在反序列化XML时允许以任何顺序存储属性。当您使用GIT,SVN等跟踪输出XML文件的更改时,这是一个问题。无法确定XML文件中的数据是否已更改或属性结构已更改。
是否可以在Qt 5.x中以与Qt 4.8中相同的方式生成XML文件?
qt ×3
c++ ×2
qt5 ×2
windows ×2
linux ×1
networking ×1
qt-creator ×1
qt4 ×1
qt4.8 ×1
qtcpsocket ×1
random ×1
registry ×1
registrykey ×1
sockets ×1
utf-8 ×1
xml ×1