迁移通知

本站内容正在逐步向 https://www.weiran.ink 迁移,更新内容请到新站查找。


Word 2010 VBA调用的一个暗坑

经历了HTD:另辟蹊径,一劳永逸解决各种花式Word报表需求Windows XP下编译C++14/17程序手记的折腾,今天踩中了一个隐藏很深的坑。

本来,一堆程序都是在我的一台XP虚拟机上调试的,环境为我自己编译的QtMinGW32Office 2003。今天由于要演示,把程序拷贝到另机器上,结果在转换报告文件这一步,HTD直接崩了。奇怪的是,我手动写命令行调用HTD,结果一切正常。

开始时提出了很多挺高级的猜测,比如DLL加载顺序一类。为此搞来了ProcessExplorer,才想起来劳资这明明是静态链接Qt的程序,怎么会出加载DLL问题?不过也不是白用功,通过ProcessExplorer拿到了HTD被调用时的详细命令行,贴到命令行执行——居然一样崩溃退出!

至此完成了Debug的第一步:在一个可调试(起码能看见错误信息)的环境下稳定重现错误。具体到这里就是拿到了一个一定会出错的命令。

检查输出的错误信息,似乎是跟打不开文件有关。崩溃的原因是Word首先抛异常,返回空指针,然后未做错误处理的程序强行在空指针上调用,就完蛋了。这一步注意到,指向原始HTML报告的路径(我把HTML报告输出到了用户家目录下的临时文件目录,运行后自动删除),在Word抛异常时被修改了,C:/被替换成了C:\//,空格被替换成了%20

于是马上想到是路径问题。经多次测试,发现对于Word 2010,在VBA打开文件时,如果路径中有空格,则不可用/代替路径中的\(偏偏这是Qt的默认行为)。比如C:\Documents and Settings\xxx,写成C:/Documents and Settings/xxx是不会自动转换的。对于Word 2003Word 2016,均未发现此行为,无论是/还是\、带不带空格,都可以正确处理。

知道了原因就好办了,拿QDir::toNativeSeparators转换一下,问题解决!

  • 最后更改: 2025/05/10 05:59