迁移通知 本站内容正在逐步向 [[https://www.weiran.ink]] 迁移,更新内容请到新站查找。 --- # Word 2010 VBA调用的一个暗坑 经历了[[:Coding:MyPublish:HTD|HTD:另辟蹊径,一劳永逸解决各种花式Word报表需求]]和[[:Coding:Cpp:How_to_compile_cpp14_under_windows_XP|Windows XP下编译C++14/17程序手记]]的折腾,今天踩中了一个隐藏很深的坑。 本来,一堆程序都是在我的一台XP虚拟机上调试的,环境为我自己编译的`Qt`、`MinGW32`、`Office 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 2003`和`Word 2016`,均未发现此行为,无论是`/`还是`\`、带不带空格,都可以正确处理。** 知道了原因就好办了,[拿QDir::toNativeSeparators转换一下](https://github.com/metorm/HTD/commit/7a1c792a1dc93b14d0992178c4c755b201d28638),问题解决!