Delphi - 从 Program Files 文件夹生成文件 Win7
Delphi - Generating files from Program Files folder Win7
最近我遇到了文件创建问题,当我的 delphi 应用程序使用开始菜单或桌面快捷方式执行时,即使它 运行 是管理员。如果我 运行 以管理员身份直接从其文件夹中获取它,则没有任何问题。
基本上我已经创建了一个 delphi 32 位 GUI 程序,它使用 zipforge 归档器构建 SFX 档案。如果我 运行 从例如C:\myProgramFolder,应用程序 运行s 通常并将存档构建到指定的输出文件夹,但是,当我 运行 使用快捷方式时,我得到 I/O 105。我想它应该是与Win7安全策略有关的问题,但可能有人处理过此类问题,所以我将非常感谢任何建议。
这是一个过程,导致 I/O 105:
quickfix.ini是一个用来给SFX存根显示信息的文件,这就是为什么它在那里
procedure TfrmMain.Buildinstaller1Click(Sender: TObject);
var
presentPath: string;
begin
presentPath := ExtractFilePath(Application.ExeName);
SynEdit1.Lines.SaveToFile(presentPath + '\quickfix.ini');
CopyFile(pchar(presentPath + '\quickfix.ini'),
pchar(edSourcePath.Text + '\quickfix.ini'), false);
CopyFile(pchar(presentPath + '\bin\Uninstall.exe'),
pchar(edSourcePath.Text + '\Uninstall.exe'), false);
DeleteFile(presentPath + '\quickfix.ini');
if (edSourcePath.Text <> '') and (edOutPutPath.Text <> '') then begin
saveExe.InitialDir := edOutPutPath.Text;
if saveExe.Execute() then begin
frmProgress.Show;
try
// this is a line where the problem begins
with archiver do begin
TempDir := GetTempDirectory;
FileName := saveExe.FileName;
OpenArchive(fmCreate);
BaseDir := edSourcePath.Text;
AddFiles('*.*');
CloseArchive();
end;
except
on E: Exception do begin
writeln('Exception: ', E.Message);
Readln;
frmProgress.ProgressBar1.Position := 0;
frmProgress.Close;
end;
end;
end;
MessageDlg('QuickFix install successfully built!', mtInformation,
[mbOk], 0);
frmProgress.Close;
end else begin
MessageDlg('Source and/or output path not set. Please review.',
mtInformation, [mbOk], 0);
end;
end;
自 10 年前发布的 Vista 启用 UAC 以来,即使是管理员用户 运行 默认情况下也具有受限权限。只有当 运行 提升进程时,该进程的用户令牌才会获得管理员权限。
程序文件文件夹具有安全设置,这意味着标准用户无法写入它们。您需要将文件保存到程序文件文件夹以外的文件夹中。应用程序数据文件夹是一个显而易见的选择。
如果这个笼统的回答不能完全解释您的问题,那么请提供一个完整的程序来准确演示您的场景。
我强烈建议您检查防病毒日志,看看您的应用程序是否可能被防病毒软件阻止。
此外,我建议您检查 Windows 事件日志,看看您的应用程序是否可能被 Windows DEP(数据执行保护)阻止。
在这两种情况下,最可能的原因是您的未经过数字签名的程序正在生成可执行文件,因此可能被检测为具有潜在危险的应用程序。
顺便说一句,您的程序是否在执行期间也创建了一些临时文件?如果是,该文件是否可能存储在您的应用程序文件夹中?
编辑: 根据新信息,您声称您的程序在直接 运行 时工作正常,但在从快捷方式 运行 时失败。我强烈建议您检查快捷方式 WorkingDirectoy 参数。
您还应该避免手动添加路径分隔符“\”,因为您的路径可能已经包含一个。因此,改为使用 IncludeTrailinPathDelimiter 方法,该方法会自动检查分隔符是否已经存在,如果不存在则添加它。
所以代替:
SynEdit1.Lines.SaveToFile(presentPath + '\quickfix.ini');
你应该使用
SynEdit1.Lines.SaveToFile(IncludeTrailingPathDelimiter(presentPath) + 'quickfix.ini');
最近我遇到了文件创建问题,当我的 delphi 应用程序使用开始菜单或桌面快捷方式执行时,即使它 运行 是管理员。如果我 运行 以管理员身份直接从其文件夹中获取它,则没有任何问题。
基本上我已经创建了一个 delphi 32 位 GUI 程序,它使用 zipforge 归档器构建 SFX 档案。如果我 运行 从例如C:\myProgramFolder,应用程序 运行s 通常并将存档构建到指定的输出文件夹,但是,当我 运行 使用快捷方式时,我得到 I/O 105。我想它应该是与Win7安全策略有关的问题,但可能有人处理过此类问题,所以我将非常感谢任何建议。
这是一个过程,导致 I/O 105:
quickfix.ini是一个用来给SFX存根显示信息的文件,这就是为什么它在那里
procedure TfrmMain.Buildinstaller1Click(Sender: TObject);
var
presentPath: string;
begin
presentPath := ExtractFilePath(Application.ExeName);
SynEdit1.Lines.SaveToFile(presentPath + '\quickfix.ini');
CopyFile(pchar(presentPath + '\quickfix.ini'),
pchar(edSourcePath.Text + '\quickfix.ini'), false);
CopyFile(pchar(presentPath + '\bin\Uninstall.exe'),
pchar(edSourcePath.Text + '\Uninstall.exe'), false);
DeleteFile(presentPath + '\quickfix.ini');
if (edSourcePath.Text <> '') and (edOutPutPath.Text <> '') then begin
saveExe.InitialDir := edOutPutPath.Text;
if saveExe.Execute() then begin
frmProgress.Show;
try
// this is a line where the problem begins
with archiver do begin
TempDir := GetTempDirectory;
FileName := saveExe.FileName;
OpenArchive(fmCreate);
BaseDir := edSourcePath.Text;
AddFiles('*.*');
CloseArchive();
end;
except
on E: Exception do begin
writeln('Exception: ', E.Message);
Readln;
frmProgress.ProgressBar1.Position := 0;
frmProgress.Close;
end;
end;
end;
MessageDlg('QuickFix install successfully built!', mtInformation,
[mbOk], 0);
frmProgress.Close;
end else begin
MessageDlg('Source and/or output path not set. Please review.',
mtInformation, [mbOk], 0);
end;
end;
自 10 年前发布的 Vista 启用 UAC 以来,即使是管理员用户 运行 默认情况下也具有受限权限。只有当 运行 提升进程时,该进程的用户令牌才会获得管理员权限。
程序文件文件夹具有安全设置,这意味着标准用户无法写入它们。您需要将文件保存到程序文件文件夹以外的文件夹中。应用程序数据文件夹是一个显而易见的选择。
如果这个笼统的回答不能完全解释您的问题,那么请提供一个完整的程序来准确演示您的场景。
我强烈建议您检查防病毒日志,看看您的应用程序是否可能被防病毒软件阻止。
此外,我建议您检查 Windows 事件日志,看看您的应用程序是否可能被 Windows DEP(数据执行保护)阻止。
在这两种情况下,最可能的原因是您的未经过数字签名的程序正在生成可执行文件,因此可能被检测为具有潜在危险的应用程序。
顺便说一句,您的程序是否在执行期间也创建了一些临时文件?如果是,该文件是否可能存储在您的应用程序文件夹中?
编辑: 根据新信息,您声称您的程序在直接 运行 时工作正常,但在从快捷方式 运行 时失败。我强烈建议您检查快捷方式 WorkingDirectoy 参数。
您还应该避免手动添加路径分隔符“\”,因为您的路径可能已经包含一个。因此,改为使用 IncludeTrailinPathDelimiter 方法,该方法会自动检查分隔符是否已经存在,如果不存在则添加它。
所以代替:
SynEdit1.Lines.SaveToFile(presentPath + '\quickfix.ini');
你应该使用
SynEdit1.Lines.SaveToFile(IncludeTrailingPathDelimiter(presentPath) + 'quickfix.ini');