• MSVC结构体对齐

    ·

    发布于

    修改于

    结构体对齐测试

  • Windows命名管道注意事项

    ·

    发布于

    修改于

    1. CreateNamedPipeConnectNamedPipe函数之间,如果有客户端连接管道,是可以建立有效连接的,但是ConnectNamedPipe的返回值为FALSE,并且GetLastError返回ERROR_PIPE_CONNECTED。这个连接和正常用ConnectNamedPipe接收到的连接是一样的(MSDN上说的很清楚)。
    2. 客户端在使用TransactNamedPipe函数的时候,如果管道没有准备好,会返回错误,解决方法是使用SetNamedPipeHandleState函数将客户端管道改为PIPE_READMODE_MESSAGE模式。CallNamedPipe函数没有这个问题。


  • VS2019静态编译Qt 6.0.2

    ·

    发布于

    修改于

    准备工作

    编译需要用到以下工具:

    1. Perl version 5.12 or later [http://www.activestate.com/activeperl/]
    2. Python version 2.7 or later [http://www.activestate.com/activepython/]
    3. Ruby version 1.9.3 or later [http://rubyinstaller.org/]
    4. CMake
    5. 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,都没问题)。

    1. ucrt.lib
    2. libvcruntime.lib
    3. 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


最新