
-
Windows命名管道注意事项
- 在
CreateNamedPipe和ConnectNamedPipe函数之间,如果有客户端连接管道,是可以建立有效连接的,但是ConnectNamedPipe的返回值为FALSE,并且GetLastError返回ERROR_PIPE_CONNECTED。这个连接和正常用ConnectNamedPipe接收到的连接是一样的(MSDN上说的很清楚)。 - 客户端在使用
TransactNamedPipe函数的时候,如果管道没有准备好,会返回错误,解决方法是使用SetNamedPipeHandleState函数将客户端管道改为PIPE_READMODE_MESSAGE模式。CallNamedPipe函数没有这个问题。
- 在
-
VS2019静态编译Qt 6.0.2
准备工作
编译需要用到以下工具:
- Perl version 5.12 or later [http://www.activestate.com/activeperl/]
- Python version 2.7 or later [http://www.activestate.com/activepython/]
- Ruby version 1.9.3 or later [http://rubyinstaller.org/]
- CMake
- ninja(将ninja.exe复制到源码目录)
配置编译选项
在源码目录执行以下命令,就可以生成静态链接运行时库的Qt静态库了。
configure -prefix "C:\Qt" -confirm-license -opensource -debug-and-release -static -static-runtime -platform win32-msvc -opengl desktop如果需要一些第三方组件,可以像加上第三方组件的配置,如下所示。
configure -prefix "C:\Qt" -confirm-license -opensource -debug-and-release -static -static-runtime -platform win32-msvc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop编译
配置完成后执行
ninja.exe即可完成编译,而后执行ninja.exe install即可将库文件和头文件都拷贝到之前-prefix指定的目录中。清理
ninja.exe -t clean可能遇到的问题
如果编译遇到下面这个问题,可以按照下面链接中的方法解决。

错误截图
-
MSVC2019编译Qt6.0.2时遇到的一个编译错误
在用MSVC2019编译Qt6.0.2版本时需要到了下面这个编译错误。

错误截图 编译失败了,提示错误信息在
qtquick3d\src\3rdparty\assimp\src\code\PostProcessing\ComputeUVMappingProcess.cpp文件中的125行。那我我就找到ComputeUVMappingProcess.cpp这个文件的125行看一下。
报错代码处 这里定义了一个
unsigned int变量,名为small。说这个int后面有char,这为什么会这样呢,排查之下发现原来是在rpcndr.h文件中已经用宏把small定义成了char。
rpcndr.h中的关键部分 知道了错误原因就很好办了,因为这个
small是个局部变量,所以很好改,只需要将这个变量改个名字就行了,我这里改成small1,然后编译顺利通过。
修改后的代码
-
Qt界面添加拖拽功能
重载两个虚函数
void dragEnterEvent(QDragEnterEvent *event) override; void dropEvent(QDropEvent *event) override;
设置允许接收拖拽事件并且实现拖拽获取文件路径功能
#include <QMimeData> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); this->setAcceptDrops(true); } void MainWindow::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } else { event->ignore(); } } void MainWindow::dropEvent(QDropEvent *event) { const QMimeData* mimeData = event->mimeData(); if (mimeData->hasUrls()) { QList<QUrl>urlList = mimeData->urls(); QString fileName = urlList.at(0).toLocalFile(); if (!fileName.isEmpty()) { ui->PathLineEdit->setText(fileName); } } }
-
EXE服务进程的生命周期
SERVICE_TABLE_ENTRY service_table[2]; service_table[0].lpServiceName = L"TestService"; service_table[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; service_table[1].lpServiceName = NULL; service_table[1].lpServiceProc = NULL; StartServiceCtrlDispatcherW(service_table);
StartServiceCtrlDispatcher函数会一直阻塞直到使用SetServiceStatus通知SCM本服务已关闭,也就是说只要不通知SCM本服务已关闭,就算ServiceMain返回,该服务进程也会一直存在,原因是主线程阻塞在StartServiceCtrlDispatcher中。
-
减小PE文件体积
在VC6的时候,减小PE程序的最有效手段就是让程序链接到msvcrt.lib,这样可以消除大量的C库内联函数。但是在现在的VS版本下,只链接msvcrt.lib往往无法编译,经常会有很多C函数找不到。都是自己写的代码还好,可以手动剔除,但是在引入第三方库的时候就难受了。实际上微软更改了CRT,现在只需要同时链接以下3个库就可以生成体积很小,且移植性很好的PE程序(测试了Win7 Starter 32bit和2008r2,都没问题)。
- ucrt.lib
- libvcruntime.lib
- msvcrt.lib
更具体的内容在https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/crt-library-features?view=msvc-160
为防止链接挂掉,留一分PDF版本。
-
一个API搞定创建多级目录
分享一个NB函数,有了它就不需要递归调用CreateDirectory创建多级目录了。相比于SHCreateDirectoryEx创建多级目录,好处不言自明。
BOOL IMAGEAPI MakeSureDirectoryPathExists( PCSTR DirPath );
https://docs.microsoft.com/en-us/windows/win32/api/dbghelp/nf-dbghelp-makesuredirectorypathexists