//请问这段C#代码如何修改成Delphi的 
//不要用winexec和ShellExcute,因为我打开这个文件后,还要用这个进程做其他的事情 
string strAccrssFilePath = GetShortPathName(Application.StartupPath + "\\mydb.mdb"); 
Process p = Process.Start("MSACCESS", strAccrssFilePath); 
p.WaitForInputIdle(1000); 
//do something .......

解决方案 »

  1.   

    cnpack 中的两个函数,可以满足你的要求// 运行一个文件并立即返回
    function WinExecute(FileName: string; Visibility: Integer = SW_NORMAL): Boolean;
    var
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
    begin
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      StartupInfo.cb := SizeOf(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      Result := CreateProcess(nil, PChar(FileName), nil, nil, False,
        CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo,
        ProcessInfo);
    end;// 运行一个文件并等待其结束
    function WinExecAndWait32(FileName: string; Visibility: Integer;
      ProcessMsg: Boolean): Integer;
    var
      zAppName: array[0..512] of Char;
      zCurDir: array[0..255] of Char;
      WorkDir: string;
      StartupInfo: TStartupInfo;
      ProcessInfo: TProcessInformation;
    begin
      StrPCopy(zAppName, FileName);
      GetDir(0, WorkDir);
      StrPCopy(zCurDir, WorkDir);
      FillChar(StartupInfo, SizeOf(StartupInfo), #0);
      StartupInfo.cb := SizeOf(StartupInfo);  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      if not CreateProcess(nil,
        zAppName,                           { pointer to command line string }
        nil,                                { pointer to process security attributes }
        nil,                                { pointer to thread security attributes }
        False,                              { handle inheritance flag }
        CREATE_NEW_CONSOLE or               { creation flags }
        NORMAL_PRIORITY_CLASS,
        nil,                                { pointer to new environment block }
        nil,                                { pointer to current directory name }
        StartupInfo,                        { pointer to STARTUPINFO }
        ProcessInfo) then
        Result := -1                        { pointer to PROCESS_INF }
      else
      begin
        if ProcessMsg then
        begin
          repeat
            Application.ProcessMessages;
            GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
          until (Result <> STILL_ACTIVE) or Application.Terminated;
        end
        else
        begin
          WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
          GetExitCodeProcess(ProcessInfo.hProcess, Cardinal(Result));
        end;
      end;
    end;