2009-01-28 20 views
22

我想在我的代碼中調用一個windows程序,並在代碼本身中確定參數。如何使用參數調用外部程序?

我不想調用外部函數或方法,而是在WinXP環境中的實際.exe或批處理/腳本文件。 C或C++將成爲首選語言,但如果這更容易在任何其他語言中完成,請讓我知道(ASM,C#,Python等)。

回答

23

當你調用CreateProcess的(),系統()等,確保您的雙引號的文件名字符串(包括命令程序文件名),以防文件名和/或完全限定路徑有空格,否則文件名路徑的各部分將被命令解釋器解析爲單獨的參數。

system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\""); 

對於Windows,建議使用CreateProcess()。它具有更加複雜的設置,但您可以更好地控制流程的啓動方式(如Greg Hewgill所述)。對於快速和骯髒,你也可以使用WinExec()。 (system()可移植到UNIX)。

啓動批處理文件時,您可能需要使用cmd.exe(或command.com)啓動。

WinExec("cmd \"d:some path\\program.bat\" \"d:\\other path\\file name.ext\"",SW_SHOW_MINIMIZED); 

(或SW_SHOW_NORMAL如果您希望顯示命令窗口)。

Windows應該在系統PATH中找到command.com或cmd.exe,因此不需要完全限定,但是如果您想確定可以使用CSIDL_SYSTEM來編寫完全限定的文件名(不要簡單地使用C:\ Windows \ system32 \ cmd.exe)。

+1

這些是可能的未來障礙和一般澄清的精彩提示。非常感謝。 – Will 2009-01-28 05:14:41

8

我想你正在尋找Windows API中的CreateProcess函數。實際上有一系列相關的電話,但這會讓你開始。這很容易。

+1

好吧,它不像使用system()那麼簡單,但至少存在這樣的解決方案!感謝最強烈的建議和鏈接。 – Will 2009-01-28 05:19:35

5

最簡單的方法之一是使用運行時庫函數system()。它只需要一個字符串作爲參數(參數比CreateProcess少很多!)並執行它就好像它是在命令行上鍵入的一樣。 system()也會在返回之前自動等待該過程完成。

也有侷限性:

  • 你必須在啓動過程的標準輸入和標準輸出較少的控制
  • 而另一個進程正在運行,你不能做任何事情(比如決定將其殺死)
  • 你不能得到一個處理其他進程,以便查詢以任何方式

運行時庫還提供了exec*一個有趣的家庭(execl,execlp,execle,execv, execvp,或多或少),它們源自Unix遺產並提供對該過程的更多控制。

在Win32的最低級別,所有進程都由CreateProcess函數啓動,這爲您提供了最大的靈活性。

+0

這絕對是我以爲我在尋找......但這些限制很難通過......我可能會這樣做,如果設計將與它一起工作。感謝這個信息! – Will 2009-01-28 05:12:24

8

C++例如:

char temp[512]; 
sprintf(temp, "command -%s -%s", parameter1, parameter2); 
system((char *)temp); 

C#示例:

private static void RunCommandExample() 
    { 
     // Don't forget using System.Diagnostics 
     Process myProcess = new Process(); 

     try 
     { 
      myProcess.StartInfo.FileName = "executabletorun.exe"; 

      //Do not receive an event when the process exits. 
      myProcess.EnableRaisingEvents = false; 

      // Parameters 
      myProcess.StartInfo.Arguments = "/user testuser /otherparam ok"; 

      // Modify the following to hide/show the window 
      myProcess.StartInfo.CreateNoWindow = false; 
      myProcess.StartInfo.UseShellExecute = true; 
      myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized; 

      myProcess.Start(); 

     } 
     catch (Exception e) 
     { 
      // Handle error here 
     } 
    } 
+0

很好的例子,謝謝! – Will 2009-01-28 05:22:04

相關問題