如何从Delphi7中正确打开.bat文件(例如,打开RandomApp.exe)?

如何从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

+1

为什么你会问外壳打造一个cmd进程来执行一个脚本来创建一个进程。为什么不创建一个流程。将4步骤变为1. –

+0

@DavidHeffernan嘿,感谢您花时间回复。请注意,如果您的答案包含一些指导或指向所需建议的链接,那么您的答案可能会更有帮助。所以,如果你可以,请帮助我这样?谢谢。 – user3215933

+0

调用CreateProcess并将路径传递给可执行文件。 –

不要依赖相对路径,总是使用绝对路径。

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; 
+0

这在Delphi 7中可以很好地工作。第一个参数(HWND)可以是'0',并且您需要试验最后一个参数。其他选项包括'SW_SHOWNORMAL'和'SW_SHOWMINIMIZED'。 – AlainD

+2

@AlainD HWND *可以*为0,但*不应该*为0,如果你有一个可用。事实上,由于代码是在按钮点击,我会使用表单的HWND而不是应用程序的。 –

+1

实际上,不应该调用ShellExecute,没有所有者窗口,只需调用CreateProcess。 –