【问题标题】:Cannot run win32 exe on windows 7无法在 Windows 7 上运行 win32 exe
【发布时间】:2013-05-25 23:15:52
【问题描述】:

我使用 IdHTTP 和 IdFTP 编写了一个程序,但我遇到了问题。我在 windows XP 32 位(使用 Delphi XE4)上编写了它,并且 exe 文件(Project1.exe)工作正常。当我尝试在 windows 7 64 位上打开它时,电脑给我一个错误。

图片:

意思是“您无法访问路径或指定文件。可能您没有足够的权限”。我以前从未见过这个错误。在这里您可以看到带有源代码的文件夹的图片。

我该如何解决我的问题?

代码如下:

function downloadSrc(var aUrl:ansiString):ansiString;
begin
 with tIdHttp.create(nil) do begin        //Create Indy http object
  request.userAgent:=INET_USERAGENT;      //Custom user agent string
  redirectMaximum:=INET_REDIRECT_MAX;     //Maximum redirects
  handleRedirects:=INET_REDIRECT_MAX<>0;  //Handle redirects
  readTimeOut:=INET_TIMEOUT_SECS*1000;    //Read timeout msec
  try                                     //Catch errors
   result:=get(aUrl);                     //Do the request
   if url.port='80' then url.port:='';    //Remove port 80 from final URL
   aUrl:=url.getFullURI                   //Return final URL
  except result:='error' end;             //Return an error message if failed
  free                                    //Free the http object
 end
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
if not(DirectoryExists('C:\mk7vrlist')) then
begin
  CreateDir('C:\mk7vrlist');
end;
ComboBox1.Items.BeginUpdate;
 for i := 0 to 59 do
   begin
     ComboBox1.AddItem(IntToStr(40000+i*1000), nil);
   end;
ComboBox1.AddItem('99999', nil);
ComboBox1.Items.EndUpdate;
end;

procedure TForm1.Label5Click(Sender: TObject);
begin
 ShellExecute(self.WindowHandle,'open',PChar('http://www.mk7vrlist.altervista.org'),nil,nil,SW_SHOWNORMAL);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var s:ansiString;
begin
 IdFTP1.Host:= 'mk7vrlist.altervista.org';
 IdFTP1.Username:='mk7vrlist';
 IdFTP1.Password:=pass;
 IdFTP1.Connect;
 s:='http://www.mk7vrlist.altervista.org/databases/test.txt';
 Memo1.Lines.Add(Edit1.Text+':'+ComboBox1.Text+':'+Edit2.Text);
 Memo1.Lines.Add(downloadSrc(s));
 Memo1.Lines.SaveToFile('C:\mk7vrlist\test.txt');
 IdFTP1.ChangeDir('databases/');
 IdFTP1.Put('C:\mk7vrlist\test.txt');
 IdFTP1.Quit;
 IdFTP1.Disconnect;
 Label10.Visible:=True;
 Beep;
end;

【问题讨论】:

  • 这很可能是 NTFS 文件权限问题。程序是否正在读取其他文件并给您此错误?还是在您的程序运行后发生此错误,并且它尝试在您的计算机上读取其他内容?您没有说明该程序访问本地计算机上的内容。此外,将纯文本消息的文本直接放入您的问题中会更友好。您可以按 Ctrl-C 然后使用谷歌翻译来获取英文文本。
  • 你是想在普通的 C:\ 或 ProgramDir 之类的文件夹上写吗?
  • 程序使用winlnet在我的服务器上下载一个文本文件,并将文本保存在c:\folder1\folder2\textfile.txt
  • 写入 C:\folder1 可能是 NTFS 权限错误。您是否知道 Windows 7 不再允许您以普通用户身份在根驱动器 C: 下创建文件夹?
  • 如果你想看看我做了什么,我把我使用的代码放在了上面。这个错误不仅发生在我的 windows 7 电脑上,我和朋友测试过这个程序,他也有同样的问题。

标签: delphi


【解决方案1】:

假设您的帐户具有管理权限,请右键单击您的程序图标,然后调用“以管理员身份运行” - 您将收到提示/警告 - 单击“是”。

我不认为问题出在 32->64 位,而是从 XP 到 Win 7,默认情况下更注重访问。

您可以设置一个快捷方式配置为始终以管理员身份运行它,以避免右键单击步骤,但您仍会收到提示/警告。

【讨论】:

  • 这是确认错误原因是否是文件系统权限的更快方法。
  • 不同意您上次的编辑,提升运行应用程序是一个很好的诊断方法,可以确认哪些不清楚的意大利错误实际上是由 f/s ACL 引起的,但绝不是一个好的永久解决方案。
  • @Mikey 你搞错了。你并没有让事情变得更容易。让事情变得更容易通过 1. 理解 UAC 和 2. 使用这种理解来避免 uac 提示。我同意所有 user539484 的 cmets 的答案。
  • -1。对不起。我必须同意@David。如果您的应用程序不需要管理员访问权限,您应该编写它以便它在不需要它的情况下正常工作。懒得学习如何使用安全性仅仅意味着你正在破坏拥有安全性的好处,并且(没有冒犯,但无论如何都要这样做),这简直是愚蠢的。如果您处于“监管非常严格的行业”(并且我们在 之前已经讨论过您在哪里工作),那么您的系统管理员的工作就很糟糕。 MS 开始强制执行 UAC 已经十年了。开发人员现在没有理由不理解它并使用它。
  • 没有山。 :-) 我不同意你的解决方案,我投了反对票。我碰巧是系统管理员和开发人员。我不认识您的系统管理员,但如果他们建议您通过以管理员用户身份运行来规避适当的 UAC 要求,那么他们就没有资格胜任他们的工作。你的答案是错误的。正确的答案是修改程序,使其写入正确的位置。
【解决方案2】:

CreateDir('C:\mk7vrlist)

普通用户没有对 c:\的那种访问权限

改为这样做(伪代码):

CreateDir('%temp%\mk7vrlist)

【讨论】:

  • CreateDir 不会扩展 %temp%,所以这不起作用。您需要使用 API 正确请求 Temp 文件夹位置。
  • 我注意到了。这就是我没有投反对票的原因。 :-) 但这并不是真正的答案;它更像是一种评论。答案提供了问题的解决方案,而“做类似(这个伪代码)之类的事情”并不能提供解决方案。
猜你喜欢
  • 2011-12-01
  • 2011-02-06
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多