Как получить версию Excel и уровень безопасности макросов - PullRequest
3 голосов
/ 18 августа 2010

Microsoft недавно нарушила наш давний (и официально рекомендованный ими) код для чтения версии Excel и ее текущего уровня безопасности omacro.

Что раньше работало:

// Get the program associated with workbooks, e.g. "C:\Program Files\...\Excel.exe"
SHELLAPI.FindExecutable( 'OurWorkbook.xls', ...) 

// Get the version of the .exe (from it's Properties...)
WINDOWS.GetFileVersionInfo()

// Use the version number to access the registry to determine the security level
// '...\software\microsoft\Office\' + VersionNumber + '.0\Excel\Security'

(Меня всегда удивляло, что уровень безопасности в течение многих лет находился в небезопасной записи реестра ...)

В Office 2010 файлы .xls теперь связаны с «« Средством запуска Microsoft Application Virtualization DDE »или sftdde.EXE.Номер версии этого exe-файла, очевидно, не является версией Excel.

Мой вопрос:

Кроме фактического запуска Excel и запроса его для version и уровень безопасности (с использованием OLE CreateOLEObject ('Excel.Application')), существует ли более чистый, быстрый или более надежный способ сделать это, который будет работать со всеми версиями, начиная с Excel 2003?

Ответы [ 2 ]

4 голосов
/ 18 августа 2010

Используйте

function GetExcelPath: string;
begin
  result := '';
  with TRegistry.Create do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe', false) then
        result := ReadString('Path') + 'excel.exe';
    finally
      Free;
    end;
end;

, чтобы получить полное имя файла excel.exe.Затем используйте GetFileVersionInfo как обычно.

Насколько я знаю, этот подход всегда будет работать.

1 голос
/ 04 мая 2017

с использованием OLE CreateOLEObject ('Excel.Application'))

вы можете получить установленные версии Excel, используя то же место в реестре, что и эта функция. По сути, вы должны клонировать большую часть кода реестра этой функции. Вы можете следить за вызовом этой функции с помощью таких инструментов, как Microsoft Process Monitor, чтобы увидеть, как Windows выглядит для установленного Excel, а затем сделать это точно так же.

Вы должны открыть реестр на HKEY_CLASSES_ROOT\ и перечислить все ветви, чье имя начинается с «Excel.Application.»

Например, на этой моей рабочей станции у меня установлен только Excel 2013, и это соответствует HKEY_CLASSES_ROOT \ Excel.Application.15

Но на моей другой рабочей станции у меня установлены Excel 2003 и Excel 2010, и я тестирую различные реализации XLSX на этих двух, поэтому у меня есть два ключа реестра.

HKEY_CLASSES_ROOT \ Excel.Application.12 HKEY_CLASSES_ROOT \ Excel.Application.14

Итак, вы должны перечислить все эти ветви с этим именем, точкой и номером.

Примечание: ключ HKEY_CLASSES_ROOT \ Excel.Application \ CurVer будет иметь имя «по умолчанию» Excel, но то, что означает «по умолчанию», неоднозначно, если установлено несколько Excels. Вы можете принять это значение по умолчанию, если вам это безразлично, или вы можете сами решить, что выбрать, например, хотите ли вы максимальную версию Excel или минимальную или что-то в этом роде.

Затем, когда для каждой конкретной ветви Excel вы должны прочитать ключ по умолчанию его подсети CLSID. Например, HKEY_CLASSES_ROOT\Excel.Application.15\CLSID имеет ключ с нулевым именем, равный {00024500-0000-0000-C000-000000000046} - извлечь этот индекс в строковую переменную.

Затем выполните второй поиск - перейдите в ветку с именем вроде HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer (используйте извлеченный индекс)

Если такая ветвь существует - извлеките значение «ключ по умолчанию» с нулевым именем, чтобы получить что-то вроде C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

Последний результат - командная строка. Он начинается с имени файла (в этом примере не заключенного в кавычки, но может быть в кавычках) и сопровождается необязательной командной строкой. Вам не нужна командная строка, поэтому вы должны извлекать начальный командир, в кавычках или нет.

Затем вы должны проверить, существует ли такой exe-файл. Если это произойдет - вы можете запустить его, если нет - проверьте реестр на наличие других версий Excel.

...