【问题标题】:Delphi - Generating files from Program Files folder Win7Delphi - 从 Program Files 文件夹 Win7 生成文件
【发布时间】:2015-04-28 20:08:49
【问题描述】:

最近我遇到了一个文件创建问题,当我的 delphi 应用程序使用开始菜单或桌面快捷方式执行时,即使它以管理员身份运行。如果我以管理员身份直接从其文件夹中运行它,则没有问题。

基本上我已经创建了一个使用 zipforge 存档器构建 SFX 存档的 delphi 32 位 GUI 程序。如果我从例如运行程序C:\myProgramFolder,应用程序运行正常并将存档构建到指定的输出文件夹,但是,当我使用快捷方式运行它时,我得到 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;

【问题讨论】:

  • GUI 或控制台应用程序? 32 位还是 64 位?您如何“构建 SFX 存档”(从头开始,从 3rd 方代码)?什么类型的文件 I/O(旧的 Pascal、TStream 等)?您要写入的目标文件夹是什么?这里没有足够的信息来回答这个问题;你问的是一个描述模糊的问题。
  • 32 位 gui,使用 zipforge 构建 sfx。另一件事是,如果我直接从包含文件夹以管理员身份运行我的应用程序,没有问题,但如果我使用桌面快捷方式以管理员身份运行它,它不会让我创建它。我完全被困住了......
  • 那么你在 Program Files 中的某个地方编写,这在大多数情况下在 Windows Vista 和更高版本下是不允许的。修复您的代码,使其不这样做。 (I/O 错误 105 是 File not open for writing,根据文档,这是由于在没有打开控制台窗口的情况下使用 Write/WriteLn 引起的。)
  • 对不起。您已在此处接受了答案,这表明您已找到解决方案。我没有建议。
  • 这正是大卫所说的。您不应该将临时文件写入程序文件文件夹。您是否知道硬盘上除了程序文件夹之外的其他位置可能是您编写文件的更好位置? Microsoft 不希望您做您正在做的事情。别了。

标签: delphi windows-7


【解决方案1】:

自从 10 年前发布的 Vista 启用 UAC 以来,即使是管理员用户也默认使用受限权限运行。只有在运行提升的进程时,该进程的用户令牌才会获得管理员权限。

程序文件文件夹具有安全设置,这意味着标准用户无法对其进行写入。您需要将文件保存到程序文件文件夹以外的文件夹中。应用程序数据文件夹是一个显而易见的选择。

如果这个一般性答案不能完全解释您的问题,那么请提供一个完整的程序来准确地演示您的场景。

【讨论】:

  • 感谢您的回答,David,我不是在写 Program Files,我只是从 Program Files 运行我的程序,这可能会限制它在任何地方写入的功能。如前所述,如果我从 C 运行它:写入磁盘上的任何文件夹(甚至是 Program Files)都没有问题。
  • 我非常怀疑这一点。您可能没有意识到您正在写入包含可执行文件的文件夹,但证据表明并非如此。现在,请再次阅读您的问题,并问自己如何有人会给出比我更具体的答案。要充分利用 Stack Overflow,您必须努力提出好的问题。有所有必要的细节。一旦你能够做到这一点,你会发现你不需要问这么多问题,因为你对细节的关注度提高了,你就可以自己解决问题。
【解决方案2】:

我强烈建议您检查您的防病毒日志,看看您的应用程序是否可能被您的防病毒软件阻止。

我还建议您检查 Windows 事件日志,看看您的应用程序是否可能没有被 Windows DEP(数据执行保护)阻止。

在这两种情况下,最可能的原因是您的未经过数字签名的程序正在生成可执行文件,因此可能被检测为潜在危险的应用程序。

顺便说一句,您的程序在执行过程中可能还会创建一些临时文件吗?如果是,该文件是否可能存储在您的应用程序文件夹中?

编辑:根据新信息,您声称您的程序在直接运行时工作正常,但在从快捷方式运行时失败。我强烈建议您检查快捷方式 WorkingDirectoy 参数。

您还应避免手动添加路径分隔符“\”,因为您的路径可能已经包含一个。因此,请改用 IncludeTrailinPathDelimiter 方法,该方法会自动检查分隔符是否已经存在,如果不存在则添加它。

所以而不是:

SynEdit1.Lines.SaveToFile(presentPath + '\quickfix.ini');

你应该使用

SynEdit1.Lines.SaveToFile(IncludeTrailingPathDelimiter(presentPath) + 'quickfix.ini');

【讨论】:

  • @Lukas Syn Durjan 很高兴我的回答对您有所帮助,但是由于我指出了多种原因,如果您可以发表评论,那将是很好的,具体原因是什么原因让其他人知道.
  • 您的回答帮助我进一步思考,我发现我的 zipforge 存档器正在使用我的本地 exe 路径作为其 TempDir。这是问题之一,但现在我发现了另一个问题。我在试图描述我的问题时犯了很多错误,看起来我真的不确定自己发生了什么。对不起。
  • SilverWarrior,你是天才。这是我的快捷方式的工作目录参数。 10000 倍谢谢!
  • 特别感谢您关注我的问题,而不是对我表达问题的方式或我如何错过缩进的无用批评,这是我真正的问题。感谢您的帮助!
  • 现在您知道工作目录正在影响您的应用程序,然后找到它所依赖的代码。因为只有这样,您才能完全解决您的问题,特别是因为它可以随时更改特定应用程序的工作目录,甚至可以从外部应用程序。
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2012-07-12
  • 2012-08-17
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多