Delphi - 从Program Files文件夹Win7生成文件

时间:2015-02-26 12:33:59

标签: delphi windows-7

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

基本上我已经创建了一个delphi 32位GUI程序,它使用zipforge归档程序构建SFX归档。如果我从例如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;

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:-1)

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

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

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

BTW是你的progarm,也许还会在执行过程中创建一些临时文件?如果是该文件可能存储在您的应用程序文件夹中?

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

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

所以而不是:

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

你应该使用

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