windows - 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);
解决方案
如果有人想使用它,我会提供一个修复程序。我不清楚是否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);
推荐阅读
- android - openapitools 生成带有版本的模型
- javascript - 调整窗口大小时重新计算偏移值
- node.js - MongoDB中除String之外的不同类型的全文搜索
- python - 获取每个抓取链接的列表长度
- java - Tomcat 和 JNDI
- webrtc - 具有多个对等连接的 WebRTC - 现有对等连接之间的流在创建新连接时停止
- javascript - 如何使用 TypeScript 在 NodeJS 中动态导入 .js 文件?
- python - Google Places Find_Place API 请求不返回商家名称
- javascript - 为 Chrome 扩展创建另一个完整页面(React+Typescript)
- laravel - 日期时间的 Laravel 类型提示