【问题标题】:Win32::OLE::Const can't find 64-bit MS Office constantsWin32::OLE::Const 找不到 64 位 MS Office 常量
【发布时间】: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


【解决方案1】:

如果有人想使用它,我会提供一个修复程序。我不清楚Win32::OLE 是否仍在维护,因为几个月前https://rt.cpan.org/Public/Bug/Display.html?id=48858 的问题列表提出了这个确切的项目,所以我不确定在哪里提交补丁。

正如该链接中所述,有几种方法可以解决此问题(例如,如果两者都存在,则优先考虑 win64 条目),但是我认为在我们的情况下最好只查询 @987654324 @文件夹如果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);

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多