我想在我的代碼中調用一個windows程序,並在代碼本身中確定參數。如何使用參數調用外部程序?
我不想調用外部函數或方法,而是在WinXP環境中的實際.exe或批處理/腳本文件。 C或C++將成爲首選語言,但如果這更容易在任何其他語言中完成,請讓我知道(ASM,C#,Python等)。
我想在我的代碼中調用一個windows程序,並在代碼本身中確定參數。如何使用參數調用外部程序?
我不想調用外部函數或方法,而是在WinXP環境中的實際.exe或批處理/腳本文件。 C或C++將成爲首選語言,但如果這更容易在任何其他語言中完成,請讓我知道(ASM,C#,Python等)。
當你調用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)。
我想你正在尋找Windows API中的CreateProcess函數。實際上有一系列相關的電話,但這會讓你開始。這很容易。
好吧,它不像使用system()那麼簡單,但至少存在這樣的解決方案!感謝最強烈的建議和鏈接。 – Will 2009-01-28 05:19:35
最簡單的方法之一是使用運行時庫函數system()
。它只需要一個字符串作爲參數(參數比CreateProcess
少很多!)並執行它就好像它是在命令行上鍵入的一樣。 system()
也會在返回之前自動等待該過程完成。
也有侷限性:
運行時庫還提供了exec*
一個有趣的家庭(execl
,execlp
,execle
,execv
, execvp
,或多或少),它們源自Unix遺產並提供對該過程的更多控制。
在Win32的最低級別,所有進程都由CreateProcess
函數啓動,這爲您提供了最大的靈活性。
這絕對是我以爲我在尋找......但這些限制很難通過......我可能會這樣做,如果設計將與它一起工作。感謝這個信息! – Will 2009-01-28 05:12:24
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
}
}
很好的例子,謝謝! – Will 2009-01-28 05:22:04
這些是可能的未來障礙和一般澄清的精彩提示。非常感謝。 – Will 2009-01-28 05:14:41