如何从Delphi7中正确打开.bat文件(例如,打开RandomApp.exe)?
我搜索了很多,我不完全找到正确的答案。如何从Delphi7中正确打开.bat文件(例如,打开RandomApp.exe)?
目录:
-
项目(该文件夹包含Delphi代码和一个名为 “RunThis”
-
RunThis
- RandomApp.exe
- 运行文件夹。蝙蝠
- CONFIG.TXT
-
代码run.bat文件
start %cd%\RandomApp.exe
pause
Delphi 7中(执行上的按钮的点击此代码。)
ShellExecute (application.handle, 'open', 'cmd', PChar('cmd.exe /c RunThis\Run.bat'), nil, SW_MAXIMIZE
如果我不要为该目录添加'cmd.exe/c'部分,Delphi将打开一个没有任何代码的cmd。熟悉如果必须运行cmd.exe。但是,如果我添加'cmd.exe/c',则它会正确打开Run.bat。
Windows给我这个错误: Windows无法找到'C:\ Project \ RunThis \ RandomApp.exe'。请确保您输入的名称正确,然后再试一次。
有趣的是,如果我只需双击Run.bat,它就可以完美地执行操作。但是,当我通过Delphi打开它时,它给了我这个错误。我想也许Run.bat当前地址有问题。所以,不要说:
start RandomApp.exe
我用,而不是完整的当前目录:
start %cd%\RandomApp.exe
我想补充,当我德尔福7只是直接打开程序,如:
ShellExecute(Handle, 'open', PChar('RunThis\RandomApp.exe'),null, null, SW_SHOWNORMAL) ;
该程序给了我一个错误,它找不到“Config.txt”。 RandomApp.exe使用一个存储所有设置的文本文件。
再次,如果我只需点击Run.bat或RandomApp.exe,它们都可以完美地执行。问题是当我尝试用代码打开它时。我觉得它与目录有关,但我不太清楚。
非常感谢。
PS:运行Windows 10
不要依赖相对路径,总是使用绝对路径。
RandomApp.exe
很可能使用相对路径来寻找Config.txt
,但是当你从你的应用程序运行,当前工作目录是项目文件夹,而不是RunThis
文件夹。这就是为什么RandomApp.exe
找不到该文件。因此,传递正确的文件夹ShellExecute()
,如:
var
Folder: string;
begin
Folder := ExtractFilePath(Application.ExeName)+'RunThis\' ;
ShellExecute(Application.Handle, nil, PChar(Folder+'Run.bat'), nil, PChar(Folder), SW_MAXIMIZE);
end;
这在Delphi 7中可以很好地工作。第一个参数(HWND)可以是'0',并且您需要试验最后一个参数。其他选项包括'SW_SHOWNORMAL'和'SW_SHOWMINIMIZED'。 – AlainD
@AlainD HWND *可以*为0,但*不应该*为0,如果你有一个可用。事实上,由于代码是在按钮点击,我会使用表单的HWND而不是应用程序的。 –
实际上,不应该调用ShellExecute,没有所有者窗口,只需调用CreateProcess。 –
为什么你会问外壳打造一个cmd进程来执行一个脚本来创建一个进程。为什么不创建一个流程。将4步骤变为1. –
@DavidHeffernan嘿,感谢您花时间回复。请注意,如果您的答案包含一些指导或指向所需建议的链接,那么您的答案可能会更有帮助。所以,如果你可以,请帮助我这样?谢谢。 – user3215933
调用CreateProcess并将路径传递给可执行文件。 –