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');