【问题标题】:Delphi Execute applicationsDelphi 执行应用程序
【发布时间】:2014-01-30 16:04:35
【问题描述】:

我正在尝试使用 delphi 创建一个 dll,我设置了一些文件属性,但是我想从工作目录运行一个 .exe 文件。 我尝试使用此代码运行 exe 文件

ShellExecute(Handle, 'open', 'start.exe', nil, nil, SW_SHOWNORMAL);

但我得到错误: 未声明的标识符“句柄”。

未声明的标识符“SW_SHOWNORMAL”

运行 exe 文件的最佳方式是什么?

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    请务必将 ShellApi 添加到您的 Unit 的 uses 子句中。

    uses ShellApi;
    

    如果程序没有windows句柄,第一个参数可以为0。

    ShellExecute(0, 'open', ('start.exe'), nil, nil, SW_SHOW);
    

    “Handle”参数未在您的 start.exe 过程中定义

    Procedure TForm1.StartEXE;
    begin
    ShellExecute(0, 'open', ('start.exe'), nil, nil, SW_SHOW);
    end;
    

    这将使其可从 TForm1 中的任何其他函数或过程普遍访问。

    【讨论】:

      【解决方案2】:

      您在问题中描述的错误是:

      未声明的标识符“句柄”

      只有你知道要传递哪个句柄。将句柄传递给表单,或者传递Application 对象的句柄,或者如果您的应用程序手头没有窗口句柄,甚至可能传递0

      未声明的标识符“SW_SHOWNORMAL”

      该符号在Windows 单元中定义。您只需将该单元添加到您的uses 列表中即可。

      【讨论】:

        【解决方案3】:

        Windows 单元添加到执行此调用的单元的实现子句中,您的程序将编译。虽然在这种情况下CreateProcess 函数会是更好的选择。像这样的东西(未经测试,我不知道):-

        Procedure ExecNewProcess(Const ProgramName : String; pWait : Boolean);
        Var
          lOK : Boolean;
          lStartInfo : TStartupInfo;
          lProcInfo : TProcessInformation;
        Begin
          FillChar(lStartInfo, SizeOf(TStartupInfo), #0);
          FillChar(lProcInfo, SizeOf(TProcessInformation), #0);
          lStartInfo.cb := SizeOf(TStartupInfo);
          lOK := CreateProcess(Nil, PChar(ProgramName), Nil, Nil, False,
            CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, Nil, Nil, lStartInfo, lProcInfo);
          If lOK Then
          Begin
            If pWait Then
              WaitForSingleObject(lProcInfo.hProcess, INFINITE);
          End
          Else
            ShowMessage('Unable to run ' + ProgramName);
          CloseHandle(lProcInfo.hProcess);
          CloseHandle(lProcInfo.hThread);
        End;
        

        【讨论】:

        • 这种情况下如何使用CreateProcess函数?
        • @Dany 好像是个新问题?
        • @Dany 我修改了我的答案以包含一个(未经测试的)CreateProcess 示例。
        • lProcInfo 是一个输出参数;因此无需初始化它。而且CreateProcess的第二个参数必须是可修改的字符串。您在 D7 中侥幸成功,因为您调用 ANSI API 碰巧让您失望,但最好的做法是传递可修改的字符串。
        • 因为CreateProcessW 使用您提供的缓冲区作为其工作区来解析字符串。你在CreateProcessA 中逃脱了它,因为这是CreateProcessW 的包装器,CreateProcessA 创建了一个可修改的缓冲区以传递给CreateProcessW。这就是所有的实现细节,文档也很清楚。这是一个非常常见的错误。调用 Unicode 版本时会产生 AV。将字符串复制到局部变量并在其上调用UniqueString。工作完成。
        猜你喜欢
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 2016-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多