【问题标题】:How to send both command line switches and paramstring with TShellExecuteInfo如何使用 TShellExecuteInfo 发送命令行开关和参数字符串
【发布时间】:2019-05-09 03:46:29
【问题描述】:

我正在使用 Delphi 6(是的,我知道,但我是老派)。

TShellExecuteInfo 有问题。我想运行这个命令:C:\delphi\bin\Convert.exe -b-i 加上一个参数字符串(文件夹和文件名)。

如果我将-b-i 放在Executeinfo.lpfile 之后,则ShellExecuteEx() 找不到Convert.exe,如果我将它放在Paramstring 中,则Convert.exe 找不到该文件。

我在这方面花了 3 天时间,所以希望您能提供帮助。

顺便说一句,为什么 Delphi 会突然开始将我的文件保存为文本?

【问题讨论】:

    标签: delphi delphi-6 shellexecuteex


    【解决方案1】:

    您根本不应该为此使用ShellExecuteEx()。该函数用于执行文档文件,而不是运行应用程序。您应该改用CreateProcess()。只需将整个命令传递到其lpCommandLine 参数,例如:

    procedure ConvertFile(const FileName: string);
    var
      Cmd: string;
      Si: TStartupInfo;
      Pi: TProcessInformation;
    begin
      Cmd := 'C:\delphi\bin\Convert.exe -b -i ' + AnsiQuotedStr(FileName, '"'); 
    
      ZeroMemory(@Si, Sizeof(Si));
      Si.cb := Sizeof(Si);
    
      if not CreateProcess(nil, PChar(Cmd), nil, nil, False, 0, nil, nil, Si, Pi) then
        RaiseLastOSError;
      try
        //...
      finally
        CloseHandle(Pi.hThread);
        CloseHandle(Pi.hProcess);
      end;
    end;
    

    【讨论】:

    • 谢谢 Remy Weel 至少现在隐蔽正在运行,但它没有转换任何东西
    • @user2844963 这个答案解决了被问到的问题。至于为什么实际上什么都没有发生,这是一个单独的问题,需要一个单独的问题。
    • @user2844963 需要更多信息。您传递给它的实际文件名是什么?该文件在转换前是什么格式的?
    • @Remy Lebeau 我发送的文件是 Delphi 表单 (.dfm),由于某种原因已保存为文本,因此我只能将其作为文本打开,而不能像往常一样操作组件会
    • 如果您打开 DFM 本身,而不是打开 DFM 所属的单元,就会发生这种情况。在 IDE 中打开单元,然后您应该能够打开表单设计器并根据需要修改 DFM。如果需要,您可以右键单击表单设计器并选择要保存为文件的 DFM 格式(文本与二进制)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2012-07-30
    • 2021-03-06
    相关资源
    最近更新 更多