У меня есть приложение MS Access, которое я планирую продавать людям, однако оно использует ODB C (MYSQL) для подключения к бэкэнду MySQL DB плюс, очевидно, требуется доступ ms (по крайней мере, во время выполнения).
Я создал установщик Inno Setup для проверки установленных компонентов, однако я столкнулся с некоторыми проблемами:
- ODB C 64x завершается ошибкой, если только у вас не установлен ODB C 32x
- ODB C (любой) не может быть установлен, если не установлен соответствующий бит Visual C ++ 2015-2019
- Мой путь реестра для Visual C + обнаруживает установку, но не битовую версию!
- 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, но так как доступа там не было, мне все же нужно было включить контент при первом запуске приложения, что я не хочу делать.
Кто-нибудь знает, с чего начать выяснить вышеперечисленные проблемы ??