迁移通知
本站内容正在逐步向 https://www.weiran.ink 迁移,更新内容请到新站查找。
Word 2010 VBA调用的一个暗坑
经历了HTD:另辟蹊径,一劳永逸解决各种花式Word报表需求和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转换一下,问题解决!