Delphi 7-ShellExecute命令在某些情况下不起作用

Delphi 7-ShellExecute命令在某些情况下不起作用,delphi,shellexecute,Delphi,Shellexecute,我制作了一个游戏启动器,并使用以下命令: procedure TFMain.ImgBtn1Click(Sender: TObject); begin ShellExecute(TForm(Owner).Handle, nil, 'starter.exe', '-lang rus', nil, SW_SHOWNORMAL); end; procedure TFMain.ImgBtn1Click(Sender: TObject); begin

我制作了一个游戏启动器,并使用以下命令:

 procedure TFMain.ImgBtn1Click(Sender: TObject);
     begin
      ShellExecute(TForm(Owner).Handle, nil, 'starter.exe', '-lang rus', nil, SW_SHOWNORMAL);
     end;
procedure TFMain.ImgBtn1Click(Sender: TObject);
     begin
      ShellExecute(TForm(Owner).Handle, nil, 'bin\starter.exe', '-lang rus', nil, SW_SHOWNORMAL);
     end;
使用'-lang rus'作为参数。一切正常。游戏启动了,语言是俄语,如果我输入“-lang eng”,它仍然可以正常工作,并且游戏是英语的

starter.exe应用程序位于名为bin的文件夹中。当我想将启动器重新定位到此文件夹之外时,我使用以下命令:

 procedure TFMain.ImgBtn1Click(Sender: TObject);
     begin
      ShellExecute(TForm(Owner).Handle, nil, 'starter.exe', '-lang rus', nil, SW_SHOWNORMAL);
     end;
procedure TFMain.ImgBtn1Click(Sender: TObject);
     begin
      ShellExecute(TForm(Owner).Handle, nil, 'bin\starter.exe', '-lang rus', nil, SW_SHOWNORMAL);
     end;
但游戏并没有启动。实际上什么也没发生。
我应该更改什么?

您必须使用要启动的应用程序的完整路径

ExtractFilePathApplication.ExeName将为您提供启动程序exe的完整路径

解决方案1:使用ShellExecute

解决方案3:使用CreateProcess


您必须使用要启动的应用程序的完整路径

ExtractFilePathApplication.ExeName将为您提供启动程序exe的完整路径

解决方案1:使用ShellExecute

解决方案3:使用CreateProcess


您应该使用完全限定的绝对路径。例如,如果您知道路径是

C:\Program Files (x86)\My Company\My Game\bin\starter.exe
你应该传递那个字符串。当然,您永远不应该硬编码这样的字符串,因为它在不同的系统上可能不同。如果您的应用程序是一个通用的应用程序启动器,那么您可以从用户那里获得路径。如果你的应用程序启动了你自己公司的游戏,你必须想出一个聪明的方法来交流路径

您的问题并不清楚,但如果bin\starter.exe与应用程序的路径相对,则可以使用

ExtractFilePath(Application.ExeName) + 'bin\starter.exe'

顺便说一下,通过查看ShellExecute的返回值,您可以自己解决所有这些问题。当然,您已经仔细阅读了ShellExecute,因此您知道返回值是什么。因此,您很容易识别出未找到的错误文件,并意识到您需要完全限定的路径。

您应该使用完全限定的绝对路径。例如,如果您知道路径是

C:\Program Files (x86)\My Company\My Game\bin\starter.exe
你应该传递那个字符串。当然,您永远不应该硬编码这样的字符串,因为它在不同的系统上可能不同。如果您的应用程序是一个通用的应用程序启动器,那么您可以从用户那里获得路径。如果你的应用程序启动了你自己公司的游戏,你必须想出一个聪明的方法来交流路径

您的问题并不清楚,但如果bin\starter.exe与应用程序的路径相对,则可以使用

ExtractFilePath(Application.ExeName) + 'bin\starter.exe'

顺便说一下,通过查看ShellExecute的返回值,您可以自己解决所有这些问题。当然,您已经仔细阅读了ShellExecute,因此您知道返回值是什么。因此,您很容易识别出错误“未找到文件”,并意识到您需要一个完全限定路径。

您应该使用完全限定路径。请更具体一点,好吗?尝试将lpDirectory参数中的可执行文件目录传递给ShellExecute。1。t用于割草机。手柄最多看起来可疑。无论如何,这是不需要的。通过0。2.使用CreateProcess创建进程。当需要让shell解决如何解析shell谓词时,请使用ShellExecuteEx。3.始终检查错误。我无法想象你为什么忽视了这一点。也就是说,ShellExecute不会以正常的方式报告错误,您永远不应该使用它。如果必须解析shell谓词,请使用具有正确错误报告的ShellExecuteEx。您是否尝试在命令行上使用starter.exe-lang rus查找潜在错误消息?您应该使用完全限定路径。请更具体一点,好吗?尝试将lpDirectory参数中的可执行文件目录传递给ShellExecute。1。t用于割草机。手柄最多看起来可疑。无论如何,这是不需要的。通过0。2.使用CreateProcess创建进程。当需要让shell解决如何解析shell谓词时,请使用ShellExecuteEx。3.始终检查错误。我无法想象你为什么忽视了这一点。也就是说,ShellExecute不会以正常的方式报告错误,您永远不应该使用它。如果必须解析shell谓词,请使用具有正确错误报告的ShellExecuteEx。是否尝试在命令行上使用starter.exe-lang rus查找潜在错误消息?没有任何文件未找到消息。只是什么都没发生。此外,我不能拥有完整的路径bc C:\Program Files x86\XXXXXXX\My Game\bin\starter.exe。对于每台电脑,xxx都是不同的。如果我使用我在问题中编写的代码而不使用参数-lang rus,则即使我将启动器放在bin文件夹外,应用程序也会正常启动,并带有以下命令:shellexecuteformowner.Handle,nil,'bin\starter.exe',nil,nil,SW_SHOWNORMAL;没有,没有消息框。但我也没有这么说。“返回值”是函数返回的值。此外,我也提到了寻找绝对路径的问题。我认为您应该通过在运行时构建的绝对路径。无论如何,返回值是多少?您评论的最后一部分表明,该问题非常特定于starter.exe,因此不合适
对于StackOverflow@user3211668,您没有检查错误,所以您期望的是什么?@AndreasRejbrand实际上,ShellExecute在报告错误时基本上是无用的。您需要ShellExecuteEx@user3211668这不是个好主意。启动流程非常简单。你为什么这么容易就放弃了?没有任何文件找不到的消息。只是什么都没发生。此外,我不能拥有完整的路径bc C:\Program Files x86\XXXXXXX\My Game\bin\starter.exe。对于每台电脑,xxx都是不同的。如果我使用我在问题中编写的代码而不使用参数-lang rus,则即使我将启动器放在bin文件夹外,应用程序也会正常启动,并带有以下命令:shellexecuteformowner.Handle,nil,'bin\starter.exe',nil,nil,SW_SHOWNORMAL;没有,没有消息框。但我也没有这么说。“返回值”是函数返回的值。此外,我也提到了寻找绝对路径的问题。我认为您应该通过在运行时构建的绝对路径。无论如何,返回值是多少?您的评论的最后一部分表明,该问题非常特定于starter.exe,因此不适合StackOverflow。@user3211668您没有检查错误,那么您期望的是什么?@AndreasRejbrand实际上,ShellExecute在报告错误时基本上是无用的。您需要ShellExecuteEx@user3211668这不是个好主意。启动流程非常简单。为什么这么容易放弃呢?事实上,PChar对所有Delphi版本都适用ExtractFilePath通常包含尾部斜杠,所以不要在“bin\starter”中包含前导斜杠。最好使用IncludeTrailingPathDelimiterTractFilePath…,来解释ExtractFilePath不包含尾随斜杠的情况。您链接到一组不相关的错误代码。这些不适用于ShellExecute。这导致了一个事实,即您永远不应该调用ShellExecute。试图坚持这样做毫无意义。编写不处理错误的代码毫无意义。别再鼓吹了。永远不要叫它。ShellExecuteEx是你的人。但是,在这个场景中,需要的是CreateProcess。@David我也添加了CreateProcess。我们可以稍后删除评论。事实上,PChar适用于所有Delphi版本ExtractFilePath通常包含尾部斜杠,因此不要在“bin\starter”中包含前导斜杠。最好使用IncludeTrailingPathDelimiterTractFilePath…,来解释ExtractFilePath不包含尾随斜杠的情况。您链接到一组不相关的错误代码。这些不适用于ShellExecute。这导致了一个事实,即您永远不应该调用ShellExecute。试图坚持这样做毫无意义。编写不处理错误的代码毫无意义。别再鼓吹了。永远不要叫它。ShellExecuteEx是你的人。但是,在这个场景中,需要的是CreateProcess。@David我也添加了CreateProcess。我们可以稍后删除评论。