编译 libmagic.dll

libmagic 是由 file 命令提供的一个开源库,用于检测文件的类型,最新版本为 5.46,发布于 2024年 11 月。PyPI 上有一个名为 python-magic-bin 的包提供了编译好的 Windows 二进制版本,然而最后一次更新已是 8 年前。Scoop 的 main 仓库中也包含了一个由第三方编译的 file 命令,版本号为 5.45,但没有提供 libmagic 的动态链接库。此外,5.45 的 Magic 文件版本是 19,而 5.46 已经升级到 20,两者不兼容。看来是时候考虑自己编译一个 Windows 版本了。

……

获取 Windows 系统默认字体和对应的字体文件

自 Windows Vista 和 Windows Server 2008 开始,操作系统界面默认的字体为 Segoe UI ,而 Windows XP 及之前的系统界面默认字体为 Tahoma 。不过 Segoe UI 字体的字形并不包含包括汉字在内的东亚文字。中文版 Windows 使用微软雅黑作为默认中文字体。

其他语言的默认字体见下表:

语言字体
简体中文Microsoft YaHei UI
繁体中文Microsoft JhengHei UI
日文Yu Gothic UI
韩文Malgun Gothic
希伯来文Gisha
泰文Leelawadee

不过相较于查表获取 Windows 系统的默认字体,使用 Windows API 来获取当前系统的默认字体会更加可靠。

……

跨平台 C 语言开发
  1. 通过 WIN32 宏来判断是否为 Windows 平台。64位 Windows 也会定义 WIN32 宏,此外还定义 WIN64 宏,有些编译器可能是 Windows__WIN32__WIN32_WIN64
  2. 通过 _MSC_VER 宏判断是否是VC编译器
  3. 通过 __GNUC__ 宏来判断是否为 gcc 编译器
  4. Windows 平台上的 gcc 编译器支持__declspec(dllimport)__declspec(dllexport)
  5. Linux 平台上 gcc 通过 __attribute__ ((visibility("default"))) 来导出函数
  6. VC不支持 inline 关键字,要用 __inline。可以用如下代码定义:
    C#if defined(_MSC_VER) && !defined(__cplusplus) && !defined(inline)
        #define inline __inline
    #endif
  7. 数组索引用 size_t 类型、指针运算用 uintptr_t, intptr_t, ptrdiff_t、平台无关整型用 int32_t, int64_t
  8. 64位平台上的 sizeof(long double) 是16字节(VC不支持),但是实际使用长度是12字节,4字节填充的是随机数据(绝对大坑)
  9. 如果 C 代码可能被 C++ 项目使用,最好根据 __cplusplus 宏做下判断
  10. MacOSX的平台宏是 __APPLE____MACH__(这个没确认)
  11. 补充几个编译器识别的宏:__BORLANDC____llvm____clang____WATCOMC__

……

MSN 双开工具源代码

网上偶然拾得本人于 2006 年所写的 MSN Messenger 双/多开工具的源代码。此即时通讯软件早于 2013 年便已停止服务,而今再看昔日所写代码不甚感慨,遂记录于此,以兹纪念