独钓寒江雪

用C++的优雅,驯服Windows的狂野

C++从C++11开始引入了智能指针(std::unique_ptr、std::shared_ptr、std::weak_ptr),并后面的各个版本中对智能指针进行了改进。

阅读全文 »

使用Qt静态库违背了Qt的免费使用协议!

编译

编译Qt源码需要提前安装如下工具:

  • nasm
  • perl
  • gperf
  • win_flex_bison
  • llvm
  • python2
  • openssl
阅读全文 »

同一个DLL文件可以被多个进程加载。当不同的进程将DLL映射到自己的内存空间时,系统会为DLL中的全局和静态变量创建不同的实例,而不会共享同一个变量实例。

那我们如何实现在进程间共享DLL全局变量呢?
我们可以在DLL中使用如下语句来创建一个段,用来存放那些需要共享的变量:

1
2
3
4
#pragma data_seg("AnyName")  // 开始
// 声明变量
// ....
#pragma data_seg() // 结束

共享的变量需要被初始化,并且还要设置链接器开关,使该段在所有映射DLL的进程中成为共享读写属性:

1
2
// 共享读写
#pragma comment(linker,"/SECTION:AnyName,RWS")

经过上述操作,共享的变量就可以跨不同进程进行读写操作了。

exit命令

exit命令用于退出当前的批处理脚本,并返回一个退出代码ExitCode(即返回值)。退出代码通常是一个整数,用于指示脚本执行的状态,例如成功(0)或失败(非零值)。

exit命令的语法为:

1
exit [/b] [exitCode]

其中 /b 选项表示仅退出当前批处理脚本的执行,而不会影响调用脚本的父进程。如果不使用 /b 选项,则 exit 命令会终止当前整个的命令处理器进程(CMD.EXE),并返回退出代码给调用者。

exitCode 是一个可选参数,用于指定退出代码。如果未指定退出代码,则默认返回上一个命令的退出代码。

阅读全文 »

Qt 虽然提供了诸如 Qt::FramelessWindowHint 之类的属性可以移除窗体的边框,但是移除边框之后,窗体的一些默认行为同时也被移除了,如鼠标拖动改变大小、双击标题栏最大化等,这些行为需要开发者自己来实现。

本文主要介绍实现无边框窗体的几种方案,并在最后分享了作者实现的方案。

笔者认为,一个完美的无边框窗体解决方案需要支持如下功能:

  1. 支持通过使用鼠标拖拽来改变窗体位置和大小;
  2. 支持双击标题栏最大化窗体和还原窗体;
  3. 支持 Windows Areo Snap 特性;
  4. 支持系统阴影;
  5. 支持跨不同 DPI 的屏幕拖拽;
  6. 适应分辨率和 DPI 改变;
阅读全文 »

Hexo是一个快速、简洁且高效的博客框架,使用Hexo可以快速地生成静态博客框架。在框架生成完成后,可以使用任意文本编辑器语法书写博客。我们可以使用Markdown语法书写博客,Hexo在生成博客时会自动将Markdown解析成Html静态页面。

Hexo官网:https://hexo.io/zh-cn/
Hexo中文文档:https://hexo.io/zh-cn/docs/

阅读全文 »

本文使用的工具都是 Windows SDK 自带的,可以采用单独安装 Windows SDK的方式,也可以通过安装 Visual Studio 来附带安装 Windows SDK。

1
2
3
4
5
6
# 在弹出界面设置密码123456
makecert.exe -sv test.pvk -r -n "CN=test.com" test.cer

cert2spc.exe test.cer test.spc

pvk2pfx.exe -pvk test.pvk -pi 123456 -spc test.spc -pfx test.pfx -f

使用 SignTool 工具对 EXE 文件签名:

1
signtool.exe sign /f test.pfx /p 123456 Setup.exe
0%