如何将程序安装到用户的桌面?

时间:2013-04-11 17:56:30

标签: windows delphi delphi-7 uac

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

  

系统错误。代码: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;

1 个答案:

答案 0 :(得分:1)

我不知道这是否是问题所在,但这并不是你如何抓住登录用户桌面的路径。路径很可能具有这种形式,但在很多情况下它不会。

例如:

  1. 旧版本的Windows,例如XP。
  2. 未来尚未发布的Windows版本会改变一切。
  3. 用户移动他们的个人资料。
  4. 本机使用英语以外的语言,桌面已本地化。
  5. 执行此操作的正确方法是使用接收CSIDL或已知文件夹ID的函数之一。例如,将CSIDL_DESKTOP传递给SHGetSpecialFolderPath

    程序文件文件夹CSIDL_PROGRAM_FILES也一样。

    一旦您对此进行了排序,您仍然可以获得ERROR_ACCESS_DENIED。显然,由于您要复制到登录用户的桌面,您应该拥有该文件夹的权限?是否有任何干扰该文件夹的安全设置?打开安全设置对话框,查看该文件夹中的有效权限。该文件是否已存在且是否有禁止您在文件上写入的ACL?它是否已存在并且是只读的?