【问题标题】:How do I install a program to users' desktops?如何将程序安装到用户的桌面?
【发布时间】:2013-04-11 17:56:29
【问题描述】:

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

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

【问题讨论】:

  • 你应该学会格式化你的帖子。
  • 对不起,我也是这个网站的菜鸟
  • 你能帮我解决我的问题吗
  • 您确定您的应用可以访问 source 文件,而不是 destination 文件吗?为什么要使用相对路径来访问源文件?始终使用绝对路径。
  • 此代码远非“安装程序”。您应该查看免费的 InnoSetup 之类的东西,然后构建一个实际的安装程序。你有硬编码的文件路径(至少其中一个是完全错误的,顺便说一句);有 API 调用会返回正确的位置。 InnoSetup 将允许您构建一个实际的Setup.exe,它将文件放置在适当的位置,正确创建快捷方式,让您的生活更加简单。

标签: windows delphi delphi-7 uac


【解决方案1】:

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

例如:

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

正确的做法是使用接收CSIDL 或已知文件夹ID 的函数之一。例如通过将CSIDL_DESKTOP 传递给SHGetSpecialFolderPath

程序文件夹CSIDL_PROGRAM_FILES也是如此。

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

【讨论】:

  • 代码也尝试直接复制到`C:\Program Files`,也无法访问。
  • @Ken 它会在提升运行时。根据 Q,复制到 Program Files 成功,但随后的复制失败。
  • @DavidHeffernan 正是你刚才所说的我的想法。但有趣的是,当我看到我的话被你敲的那一刻,我立刻改变了主意。你知道吗 ?尽管他说“以管理员身份运行”,但我怀疑他确实没有提升。 c:\Users\xxxx\AppData\Local\VirtualStore\Program Files (x86)\ ;-)
  • 不过,他是否跑得高并不重要。他不会将他的 EXE 推送到“所有用户”桌面,而是推送到当前用户的私人桌面。无论有没有管理员授权,它都应该工作。我猜EXE已经存在并且正在运行或被其他进程锁定。 Procexp 当然可以展示它......但是 TS 的代码被它的意图所破坏,我觉得任何帮助使该代码工作的尝试都是犯罪行为。这就像……嗯,就像在纸屋里帮孩子烧湿火柴一样。
  • 好吧,我们最好像你在激励我一样铸造它:-D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多