使用 Inno Setup 将 Excel Addin 文件夹添加到受信任的位置
Adding Excel Addin folder to Trusted locations with Inno Setup
我正在使用 Inno Setup ExcelAddinInstaller,效果很好。
{
Looks up the localized Addins folder in the registry.
This function is used in the [Files] section of the
script, where function calls always expect a parametrized
function. This function does not require a parameter.
Therefore, a dummy parameter is defined.
}
function GetDestDir(dummyparameter: string): string;
var
Addins: string;
s: string;
CallName: string;
i: integer;
begin
if DestDir = '' then
begin
CallName := 'GetDestDir(' + dummyparameter + '): ';
log(CallName+'Trying to find addins folder name');
{
Note the trailing backslash
}
DestDir := ExpandConstant('{userappdata}\Microsoft\');
{
Loop through possible version numbers of Excel and find out if
any installed version uses an addin folder other than "addins".
This can be the case with international versions (other than English).
If an addin folder name that is different from "Addins" is found,
the addin will be installed into a dedicated folder.
}
for i := 8 to 32 do
begin
s := '';
if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Microsoft\Office\'
+IntToStr(i)+'.0\Common\General', 'AddIns', s) then
begin
if Length(Addins) > 0 then
begin
{
If the Addins variable has been set already and we encounter
a different name, reset everything in order to use a dedicated
name further on.
}
if s <> Addins then
begin
{
Set the Addins variable to a zero-length string to force
using a dedicated dir name later.
}
log(CallName+'Found alternative Addins key for version '+IntToStr(i)+': "'+s+'"');
Addins := '';
{
Once a single dir name that is different from "Addins" was
found, we can exit the loop.
}
break;
end
end
else
begin
{
Addins variable has zero length: Set it to the current value of s
}
log(CallName+'Found first Addins key: version '+IntToStr(i)+', "'+s+'"');
Addins := s;
end
end
end;
{
Check if the Addins variable contains something now; if not, use
a default value ('XL Toolbox')
}
if Addins = '' then
begin
DestDir := ExpandConstant('{userappdata}\Microsoft\Addins\');
RegisterWithFullPath := true;
log(CallName+'Using dedicated folder: "'+DestDir+'"');
end
else
begin
DestDir := ExpandConstant('{userappdata}\Microsoft\' + Addins);
RegisterWithFullPath := false;
log(CallName+'Installing to default Addins folder: ' + DestDir);
end;
end;
result := DestDir;
end;
但是碰巧在Excel 2016和2013中默认安装加载项的文件夹没有被Excel定义为"trusted location",使得加载项- in 安装但不显示在 Excel.
我正在寻找将 GetDestDir
返回的路径添加到
HKEY_CURRENT_USER\Software\Microsoft\Office.0\Excel\Security\Trusted Locations\MyLocation
以下代码在 Trusted Locations
下找到第一个未使用的 LocationX
子项,并在其中写入 Addins
路径:
const
TrustedLocationsKey =
'Software\Microsoft\Office.0\Excel\Security\Trusted Locations';
procedure AddAddinsToExcelTrustedLocations;
var
LocationIndex: Integer;
LocationKey: string;
Path: string;
begin
if not RegKeyExists(HKEY_CURRENT_USER, TrustedLocationsKey) then
begin
MsgBox('Excel trusted locations registry key not found', mbError, MB_OK);
end
else
begin
{ Find unused LocationX }
LocationIndex := 0;
repeat
LocationKey := Format('%s\Location%d', [TrustedLocationsKey, LocationIndex]);
Log(Format('Trying %s', [LocationKey]));
Inc(LocationIndex);
until (not RegKeyExists(HKEY_CURRENT_USER, LocationKey));
Log(Format('Will use %s', [LocationKey]));
{ Addins is the variable from your question code }
Path := GetDestDir('');
if not RegWriteStringValue(HKEY_CURRENT_USER, LocationKey, 'Path', Path) then
begin
MsgBox(
Format('Cannot add %s to Excel trusted locations', [Path]), mbError, MB_OK);
end
else
begin
Log(Format('Added %s to Excel trusted locations', [Path]));
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
AddAddinsToExcelTrustedLocations;
end;
end;
我正在使用 Inno Setup ExcelAddinInstaller,效果很好。
{
Looks up the localized Addins folder in the registry.
This function is used in the [Files] section of the
script, where function calls always expect a parametrized
function. This function does not require a parameter.
Therefore, a dummy parameter is defined.
}
function GetDestDir(dummyparameter: string): string;
var
Addins: string;
s: string;
CallName: string;
i: integer;
begin
if DestDir = '' then
begin
CallName := 'GetDestDir(' + dummyparameter + '): ';
log(CallName+'Trying to find addins folder name');
{
Note the trailing backslash
}
DestDir := ExpandConstant('{userappdata}\Microsoft\');
{
Loop through possible version numbers of Excel and find out if
any installed version uses an addin folder other than "addins".
This can be the case with international versions (other than English).
If an addin folder name that is different from "Addins" is found,
the addin will be installed into a dedicated folder.
}
for i := 8 to 32 do
begin
s := '';
if RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Microsoft\Office\'
+IntToStr(i)+'.0\Common\General', 'AddIns', s) then
begin
if Length(Addins) > 0 then
begin
{
If the Addins variable has been set already and we encounter
a different name, reset everything in order to use a dedicated
name further on.
}
if s <> Addins then
begin
{
Set the Addins variable to a zero-length string to force
using a dedicated dir name later.
}
log(CallName+'Found alternative Addins key for version '+IntToStr(i)+': "'+s+'"');
Addins := '';
{
Once a single dir name that is different from "Addins" was
found, we can exit the loop.
}
break;
end
end
else
begin
{
Addins variable has zero length: Set it to the current value of s
}
log(CallName+'Found first Addins key: version '+IntToStr(i)+', "'+s+'"');
Addins := s;
end
end
end;
{
Check if the Addins variable contains something now; if not, use
a default value ('XL Toolbox')
}
if Addins = '' then
begin
DestDir := ExpandConstant('{userappdata}\Microsoft\Addins\');
RegisterWithFullPath := true;
log(CallName+'Using dedicated folder: "'+DestDir+'"');
end
else
begin
DestDir := ExpandConstant('{userappdata}\Microsoft\' + Addins);
RegisterWithFullPath := false;
log(CallName+'Installing to default Addins folder: ' + DestDir);
end;
end;
result := DestDir;
end;
但是碰巧在Excel 2016和2013中默认安装加载项的文件夹没有被Excel定义为"trusted location",使得加载项- in 安装但不显示在 Excel.
我正在寻找将 GetDestDir
返回的路径添加到
HKEY_CURRENT_USER\Software\Microsoft\Office.0\Excel\Security\Trusted Locations\MyLocation
以下代码在 Trusted Locations
下找到第一个未使用的 LocationX
子项,并在其中写入 Addins
路径:
const
TrustedLocationsKey =
'Software\Microsoft\Office.0\Excel\Security\Trusted Locations';
procedure AddAddinsToExcelTrustedLocations;
var
LocationIndex: Integer;
LocationKey: string;
Path: string;
begin
if not RegKeyExists(HKEY_CURRENT_USER, TrustedLocationsKey) then
begin
MsgBox('Excel trusted locations registry key not found', mbError, MB_OK);
end
else
begin
{ Find unused LocationX }
LocationIndex := 0;
repeat
LocationKey := Format('%s\Location%d', [TrustedLocationsKey, LocationIndex]);
Log(Format('Trying %s', [LocationKey]));
Inc(LocationIndex);
until (not RegKeyExists(HKEY_CURRENT_USER, LocationKey));
Log(Format('Will use %s', [LocationKey]));
{ Addins is the variable from your question code }
Path := GetDestDir('');
if not RegWriteStringValue(HKEY_CURRENT_USER, LocationKey, 'Path', Path) then
begin
MsgBox(
Format('Cannot add %s to Excel trusted locations', [Path]), mbError, MB_OK);
end
else
begin
Log(Format('Added %s to Excel trusted locations', [Path]));
end;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
AddAddinsToExcelTrustedLocations;
end;
end;