我们有一个传统的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);
行,如果不删除它会导致错误。
[a link](master/ds.md)
[a link](hwsf/ds.md)
![image1](plot.jpg)
答案 0 :(得分:0)
如果有人要使用它,我将提供修复程序。我尚不清楚Win32::OLE
是否仍在维护,因为https://rt.cpan.org/Public/Bug/Display.html?id=48858的问题列表是几个月前提出的确切问题的,所以我不确定在哪里提交补丁。>
如该链接中所述,有几种方法可以解决此问题(例如,优先考虑win64
条目,如果两者都存在的话),但是我认为最好只查询win64
文件夹,如果win32
没有返回任何有用的信息。
为此,请在OLE.xs
中搜索win32
并进行如下更改。
err = RegQueryValueA(hKeyLangid, "win32", szFile, &cbFile);
// check win64 if win32 failed
if (err != ERROR_SUCCESS || cbFile <= 1)
err = RegQueryValueA(hKeyLangid, "win64", szFile, &cbFile);