Использование объекта приложения Office Interop для получения версии PowerPoint во время установки с помощью Inno Setup

Во время установки нашей надстройки PowerPoint с помощью установщика Inno Setup мне нужно получить текущую используемую версию PowerPoint, запросив сам объект Application.PowerPoint — вместо того, чтобы полагаться на записи реестра , которые не могут гарантировать правильное значение .

Я успешно реализовал это для установщика MSI, написанного с помощью WIX , на основе этого ответа , используя этот код:

Imports Microsoft.Office.Interop.PowerPoint

Public Class Environment

  Public Shared Function GetPowerPointVersion() As String

    Dim CurVer As String
    Dim thisPowerPoint As Object

    thisPowerPoint = New Application()
    CurVer = thisPowerPoint.Version
    thisPowerPoint.Quit()

    Return CurVer

  End Function

End Class

Я не полностью верю, что это работает во всех ситуациях (возможно, параноидально), поэтому вставлю блоки try/catch и воспользуюсь методом реестра, если это не удастся.

Я не смог понять, как сделать то же самое с установщиком Inno Setup. Есть несколько примеров использования DLL — https://jrsoftware.org/ishelp/index.php?topic=scriptdll — но я не понимаю, как я мог бы создать из этого функцию, вызываемую из Inno Setup, которая возвращала бы номер версии.

Поможет ли это? Как я могу вызвать .NET DLL из скрипта Inno Setup?

Martin Prikryl 23.01.2023 17:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать CreateOleObject для вызова PowerPoint и возврата версии:

[Code]
function GetPowerPointVersion(): string;
var
  MyPowerPoint: Variant;
begin
  MyPowerPoint := CreateOleObject('PowerPoint.Application');
  Result := MyPowerPoint.Version;
  MyPowerPoint.Quit;
end;

Вы, вероятно, должны ловить исключения в этом коде (в случае, если объект не может быть создан).

Bill_Stewart 24.01.2023 22:50

CreateOleObject вызовет исключение, если не удастся. Итак, да, код должен быть помещен в раздел try...except или try...finally.

Matej 24.01.2023 23:29

Для тех, кто читает, ответ ОП включает обработку исключений.

Bill_Stewart 25.01.2023 15:45

Для полноты это код Pascal Script, который я сейчас использую для получения версии PowerPoint, основанный на ответе Матея, с откатом к проверке реестра в случае сбоя:

function PowerPointVersion(): String;
var
  key: String;
  versionToUse: String;
  installedPowerPoint: Variant;
begin

  versionToUse := '';

  try
    installedPowerPoint := CreateOleObject('PowerPoint.Application');
    versionToUse := installedPowerPoint.Version;
    installedPowerPoint.Quit;
  except
    versionToUse := '';
  end;

  if versionToUse = '' then
  begin
    if RegQueryStringValue(GetHKLM, 'SOFTWARE\Microsoft\Office\ClickToRun\Configuration','VersionToReport', key) then
    begin
      versionToUse := key;
      Delete(versionToUse, Pos('.', key), Length(key));
      versionToUse := versionToUse + '.0';
    end;
  end;

  if versionToUse = '' then
  begin
    if RegQueryStringValue(HKCR, 'PowerPoint.Application\CurVer\','', key) then
    begin
      StringChangeEx(key, 'PowerPoint.Application.', '', True);
      versionToUse := key;
      versionToUse := versionToUse + '.0';
    end;
  end;

  try
    // Check to see if versionToUse string can convert to a float: 
    StrToFloat(versionToUse);
    Result := versionToUse;
  except
    Result := '';
  end;

end;

Оказывается, использование Microsoft.Office.Interop.PowerPoint, который является пакетом NuGet, не является хорошей идеей, поскольку он не поддерживается и может привести к сбою. Смотрите это обсуждение.

Этот внешний код C# будет работать, и его можно настроить для вызова из Inno Setup. Однако использование CreateOleObject в коде Inno Setup Pascal, как описано в принятом ответе, намного проще.

[SupportedOSPlatform("windows")]
public class PowerPointEnvironment
{
    public static string GetPowerPointVersion()
    {
        string CurVer = "";
        Type? PowerPointType = Type.GetTypeFromProgID("PowerPoint.Application");
        if (PowerPointType != null)
        {
            dynamic? thisPowerPoint = Activator.CreateInstance(PowerPointType);
            if (thisPowerPoint != null)
            {
                CurVer = thisPowerPoint.version();
            }
        }
        return CurVer;
    }
}

Использование номера версии, возвращаемого приложением PowerPoint, может не дать вам всей необходимой информации; каждая версия, начиная с 2016 года, идентифицируется как 16.0 (включая версии Office 365). Если вы проверяете, поддерживается ли конкретная функция, номер версии может не помочь.

Steve Rindsberg 26.01.2023 23:14

Я использую номер версии, чтобы найти в реестре нужное место для регистрации надстройки. Таким образом, мы надеемся, что для этого использования номер версии, возвращаемый приложением PowerPoint, по-прежнему будет правильным для этой цели?

neilt17 27.01.2023 08:55

Да, это будет работать, как вы хотите. В основном используется номер версии, чтобы интуитивно понять, какие функции поддерживаются/не поддерживаются, что может быть проблемой. Вы можете идти.

Steve Rindsberg 28.01.2023 19:03

Другие вопросы по теме