Win32 :: OLE :: Const找不到64位MS Office常量

时间:2018-12-28 02:28:49

标签: windows perl ms-office ole win32ole

我们有一个传统的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)

1 个答案:

答案 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);