我正在尝试为我构建的应用创建安装程序。我在尝试将程序复制到用户的桌面时遇到问题:复制程序时出现错误:
系统错误。代码: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;
答案 0 :(得分:1)
我不知道这是否是问题所在,但这并不是你如何抓住登录用户桌面的路径。路径很可能具有这种形式,但在很多情况下它不会。
例如:
执行此操作的正确方法是使用接收CSIDL
或已知文件夹ID的函数之一。例如,将CSIDL_DESKTOP
传递给SHGetSpecialFolderPath
。
程序文件文件夹CSIDL_PROGRAM_FILES
也一样。
一旦您对此进行了排序,您仍然可以获得ERROR_ACCESS_DENIED
。显然,由于您要复制到登录用户的桌面,您应该拥有该文件夹的权限?是否有任何干扰该文件夹的安全设置?打开安全设置对话框,查看该文件夹中的有效权限。该文件是否已存在且是否有禁止您在文件上写入的ACL?它是否已存在并且是只读的?