首页 > 解决方案 > Win32::OLE::Const 找不到 64 位 MS Office 常量

问题描述

我们有一个遗留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);

标签: windowsperlms-officeolewin32ole

解决方案


如果有人想使用它,我会提供一个修复程序。我不清楚是否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);

推荐阅读