0

我正在尝试为我构建的应用程序创建安装程序。尝试将程序复制到用户桌面时遇到问题: 复制程序时,出现错误:

系统错误。代码:5. 访问被拒绝。

我尝试以管理员身份运行,但似乎没有任何效果。当我将文件复制到 Program Files 时,它工作正常,但是当我尝试复制到用户的桌面时,我收到错误消息。我的目标平台是 Windows 7 和 Windows 8。

这是我的一些代码:

function GetCurrentUserName : String;
const
  cnMaxUserNameLen = 254;
var
  dwUserNameLen : DWORD;
begin
  dwUserNameLen := cnMaxUserNameLen-1;
  SetLength(sUserName, cnMaxUserNameLen);
  GetUserName(PChar(sUserName), dwUserNameLen);
  SetLength(sUserName, dwUserNameLen);
  Result := sUserName;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Source, Source2, Dest, Dest2: String;
begin
  Source := 'rusmar.bin';
  Dest := 'C:/Program Files/RusMarEstimatingModel.exe';
  if not CopyFile(PChar(Source), PChar(Dest), False)
    then RaiseLastOSError;
  GetCurrentUserName;
  Source := 'rusmar.bin';
  Dest := 'C:/Users/' + sUserName + '/Desktop/RusMarEstimatingModel.exe';
  if not CopyFile(PChar(Source), PChar(Dest), False)
    then RaiseLastOSError;
  label2.Show;
  timer1.Enabled := True;
end;
4

1 回答 1

1

我不知道这是否是问题所在,但这不是您获取登录用户桌面路径的方式。路径很可能具有这种形式,但在很多情况下它不会。

例如:

  1. 旧版本的 Windows,例如 XP。
  2. 一些未来尚未发布的 Windows 版本会改变一些事情。
  3. 用户移动他们的个人资料。
  4. 机器使用英语以外的语言,并且 Desktop 已本地化。

正确的方法是使用接收一个CSIDL或已知文件夹 ID 的函数之一。例如通过传递CSIDL_DESKTOPSHGetSpecialFolderPath.

程序文件文件夹也是如此CSIDL_PROGRAM_FILES

一旦你得到这个排序,你可能仍然会得到ERROR_ACCESS_DENIED. 显然,由于您正在复制到登录用户的桌面,您应该有权访问该文件夹吗?该文件夹上的安全设置是否受到干扰?打开安全设置对话框并查看您在该文件夹中拥有的有效权限。该文件是否已经存在并且是否有一个禁止您覆盖该文件的 ACL?它是否已经存在并且是只读的?

于 2013-04-11T18:17:58.890 回答