【发布时间】:2019-05-25 22:55:17
【问题描述】:
我们有一个旧版perl 代码库,其中包括以下行:
use Win32::OLE::Const 'Microsoft Excel';
这在传统上有效,但不适用于较新的 64 位安装,例如 Windows 10。
错误似乎在下面的OLE.xs 源中,但我对 Windows 功能和一般XS 的了解有限。
err = RegQueryValueA(hKeyLangid, "win32", szFile, &cbFile);
如果这个查询失败,它永远不会调用Win32::OLE::Const::_Typelib,它是存储结果的函数。检查我的注册表,密钥确实是Win64 而不是win32。其他有效的键要么只有win32,要么两者都有。
有没有办法在不编辑旧模块的情况下解决这个问题?它被广泛使用,任何更改都会带来一些风险,所以我首先寻找替代方案。
我知道我们可以执行以下操作,但它不会阻止另一个 Win32::OLE::Const 行,如果不删除它会导致错误。
my $Excel = Win32::OLE->new('Excel.Application', 'Quit');
my $xl = Win32::OLE::Const->Load($Excel);
【问题讨论】:
-
我看不出如何在不更改源代码的情况下实现这一点,因为该值是硬编码的。 XS 是 perl 调用 C/C++ 代码的接口,顺便说一句。我无法自拔,我必须指出该模块的字面意思是“Win32::OLE”,所以我不知道您为什么希望它可以在 64 位 Windows 上运行。
-
似乎是 stackoverflow.com/questions/25509960/… 的副本 这似乎是一个简单的解决方法,不需要您更改模块,fwiw。
-
@bytepusher 同意这是确切的问题。因此,如果添加注册表项是安全的,那么我想我们将不得不走这条路并为我们所有的机器推出一个补丁。
-
好吧,如果修复只是替换注册表项 - 你把 win64::OLE 放在 cpan 上怎么样 :)
标签: windows perl ms-office ole win32ole