delphi - 如何从 delphi 2010 应用程序调用 MS-DOS 批处理程序

标签 delphi batch-file

我正在尝试编写一个从 Delphi 2010 应用程序中执行 DOS 批处理程序的例程。我在 Delphi 6 中工作的旧例程不断给我错误消息:-

“Project1.exe 引发异常类 EAccessViolation,并带有消息‘在模块 'kernel32.dll' 中地址 7C82F29C 的访问冲突。写入地址 004A3B82”。

这是我在 Delphi 6 中工作的旧例程:-

Procedure TForm1.BatchProgramCall;  
var  
    StartInfo: TStartUpInfo;  
    ProcInfo: TProcessInformation;  
    createOK: Boolean;  
begin  
     FillChar(StartInfo, SizeOf(TStartUpInfo), #0);  
     FillChar(ProcInfo, SizeOf(TProcessInformation), #0);  
     StartInfo.cb := SizeOf(TStartUpInfo);  
     StartInfo.dwFlags := STARTF_USESHOWWINDOW;  
     StartInfo.wShowWindow := SW_SHOWMINIMIZED;  

     createOK := CreateProcess(Nil,PCHAR('SOMEBATCHPROGRAM.BAT'),Nil, Nil, false,
                               CREATE_NEW_PROCESS_GROUP+HIGH_PRIORITY_CLASS,
                               NIL, NIL, STARTINFO, PROCINFO);
     if createOK then
        waitForSingleObject(PROCINFO.HPROCESS, Infinite);
end;

请让我知道我做错了什么,或者有更好的方法来解决这个问题......
非常感谢。

最佳答案

您可以阅读有关 CreateProcess 和 unicode 问题的这些文章。

  • Delphi in a Unicode World Part III: Unicodifying Your Code
  • CreateProcess Declaration

  • 此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存的指针(例如 const 变量或文字字符串)。如果此参数是一个常量字符串,该函数可能会导致访问冲突。

    您可以使用 UniqueString作为解决问题的解决方法。
    Procedure TForm1.BatchProgramCall;  
    var
        StartInfo: TStartUpInfo;
        ProcInfo: TProcessInformation;
        createOK: Boolean;
        sMyBat: string;
    
    begin
         FillChar(StartInfo, SizeOf(TStartUpInfo), #0);
         FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
         StartInfo.cb := SizeOf(TStartUpInfo);
         StartInfo.dwFlags      := STARTF_USESHOWWINDOW;
         StartInfo.wShowWindow := SW_SHOWMINIMIZED;
    
         sMyBat  :='SOMEBATCHPROGRAM.BAT';
         UniqueString(sMyBat); //this make the magic.
         createOK := CreateProcess(Nil,pchar(sMyBat),Nil, Nil, false,
                                   CREATE_NEW_PROCESS_GROUP+HIGH_PRIORITY_CLASS,
                                   NIL, NIL, STARTINFO, PROCINFO);
         if createOK then
            waitForSingleObject(PROCINFO.HPROCESS, Infinite);
    end;
    

    关于delphi - 如何从 delphi 2010 应用程序调用 MS-DOS 批处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1754389/

    相关文章:

    delphi - 施工期间如何在TPanel后代中设置标题?

    javascript - 在 Delphi TWebBrowser 中按地址显示 Google map

    delphi - Fast Report 4 (Delphi 7) 是否支持使用 frxUserDataSet 的 UTF8?

    Windows 相当于 Linux 命令 grep -A(返回搜索字符串后的行)

    c - 从批处理文件中获取击键

    java - 将字节数组转换为 float 组

    multithreading - 检测低用户事件并在后台检查电子邮件

    windows - 如何在 Windows 批处理脚本中将 %USERNAME% 的值转换为小写?

    sql - SSIS包的安全部署

    windows - 使用 Windows 脚本更改进程的亲和性