Win32 :: OLE :: Const не может найти 64-битные константы MS Office - PullRequest
0 голосов
/ 28 декабря 2018

У нас есть устаревшая кодовая база 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);

1 Ответ

0 голосов
/ 29 декабря 2018

Я предоставлю исправление на случай, если кто-то захочет его использовать.Мне не ясно, поддерживается ли 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);
...