Обнаружение офиса 365 (доступ) И Visual C 64x с использованием реестра - PullRequest
2 голосов
/ 01 мая 2020

У меня есть приложение MS Access, которое я планирую продавать людям, однако оно использует ODB C (MYSQL) для подключения к бэкэнду MySQL DB плюс, очевидно, требуется доступ ms (по крайней мере, во время выполнения).

Я создал установщик Inno Setup для проверки установленных компонентов, однако я столкнулся с некоторыми проблемами:

  1. ODB C 64x завершается ошибкой, если только у вас не установлен ODB C 32x
  2. ODB C (любой) не может быть установлен, если не установлен соответствующий бит Visual C ++ 2015-2019
  3. Мой путь реестра для Visual C + обнаруживает установку, но не битовую версию!
  4. Ms Access 365 (2019?) Не обнаружен с использованием моих текущих методов обнаружения реестра.

Используемый код:

function GetHKLM: Integer;
begin
  if IsWin64 then
    Result := HKLM64
  else
    Result := HKLM32;

  Result := HKLM;
end;

function IsOfficeInstalled: Boolean;
begin
  Result := RegKeyExists(GetHKLM, 'Software\Microsoft\Office');
end;

function NormalAccessPath: String;
var
  Names: TArrayOfString;
  I: Integer;
  S: String;   
begin
  if not IsOfficeInstalled then
      Result:=''
  else
  begin
    if RegGetSubkeyNames(GetHKLM, 'Software\Microsoft\Office', Names) then
    begin
      for I := 0 to GetArrayLength(Names)-1 do
        begin
          S := 'Software\Microsoft\Office\' + Names[I]+ '\' + 'Access';
          if RegKeyExists(GetHKLM, S) then
            Result:=S;
          S := '';
        end
    end    
  end;
end;

function IsNormalAccessInstalled: Boolean;
var
  Path: String;
begin
    Path:= NormalAccessPath;
    if Path <> '' then
      Result := True
    else
      Result := False
end;



function IsMySQLODBC51Installed: Boolean;
begin

  // the result was inverted in the original code; the original function returned
  // True if the ODBC driver was not installed, False otherwise, and according to
  // the function name it should be vice-versa
  Result := RegKeyExists(GetHKLM, 'Software\ODBC\ODBCINST.INI\MySQL ODBC 8.0 Unicode Driver');
end;



function IsRuntimeAccessInstalled: Boolean;
begin

  Result := RegKeyExists(GetHKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\AccessRuntimeRetail - en-us');



end;

function IsVCInstalled: Boolean;
begin

  Result := RegKeyExists(GetHKLM, 'Software\Microsoft\VisualStudio\14.0\VC');



end;

function AddAsTrusted: Boolean;
var
  Path: String;
  ResultCode: Integer;
begin
    Path:= NormalAccessPath;

    MsgBox('Adding Trusted Location', mbInformation, MB_OK);

    //Exec('C:\Me\freelance\Inno setup script\fixes.bat', '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
    if Path <> '' then
      begin
        //if not RegKeyExists(GetHKLM, Path + '\Security') then
        //  RegWriteStringValue(GetHKLM, Path + '\Security','MedidropUseless', 'MedidropUseless')
        if not RegKeyExists(GetHKLM, Path + '\Security\Trusted Locations') then
          RegWriteStringValue(GetHKLM, Path + '\Security\Trusted Locations\Location1','Path', 'C:\MediDrop')  
      end;  

  Result := True;
end;

Так что для 2 и 3: мне нужно обнаружить визуальную C версию. Сегодня я тестировал установщик в новом месте, и у них уже был Visual C ++ 2015 86x, поэтому моя установка не удалась для ODB C 64x, потому что Visual C 64x отсутствовал. Очевидно:

'Software\Microsoft\VisualStudio\14.0\VC'

не подходит ..

Для 4: Как видно, я проверяю Программное обеспечение \ Microsoft \ Office, однако этот компьютер имел подпапки 15.0 и 16.0 (терминология? ), но в них НЕ было ДОСТУПА, поэтому мой установщик подумал, что он не установлен.

Однако .. так и было, поэтому мне нужно найти способ найти эту версию доступа 365!

Наконец, в конце установки я добавляю путь для надежного расположения:

function AddAsTrusted: Boolean;
var
  Path: String;
  ResultCode: Integer;
begin
    Path:= NormalAccessPath;

    MsgBox('Adding Trusted Location', mbInformation, MB_OK);

    //Exec('C:\Me\freelance\Inno setup script\fixes.bat', '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
    if Path <> '' then
      begin
        if not RegKeyExists(GetHKLM, Path + '\Security\Trusted Locations') then
          RegWriteStringValue(GetHKLM, Path + '\Security\Trusted Locations\Location1','Path', 'C:\[MyAppName]')  
      end;  

  Result := True;
end;

Еще раз из-за проблемы 365 ... это не сработало. Я правильно создал путь в 16.0, но так как доступа там не было, мне все же нужно было включить контент при первом запуске приложения, что я не хочу делать.

Кто-нибудь знает, с чего начать выяснить вышеперечисленные проблемы ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...