2015-02-05 41 views
1

簡而言之,我正在爲模擬器MAME寫一個前端,作爲WPF和C#中的一項研究。Process.Start和Process.StartInfo不能正確地傳遞參數

GUI設置好了,它正在讀取cfg,除了實際啓動MAME之外,一切都很好。

從命令行(Windows 7)中,我可以鍵入以下內容並讓模擬器正常啓動。

c:\MAME\Emulator\mame.exe mslug.zip 

該模擬器沒有完全按照設計啓動問題。不過,我嘗試了以下所有內容。

Process Mame = new Process(emulatorPath); 
Mame.StartInfo.Arguments = romSelected; 
Mame.Start(); 

我試圖上述與兩個變量,並把Mame.StartInfo.Arguments =「mslug.zip」

ProcessStartInfo Mame = new ProcessStartInfo(emulatorPath); 
Mame.Arguments = romSelected; 
Process.Start(Mame); 

我想這也與可變,並把二者「mslug.zip」在它的地方。

最後我試了下面。

Process.Start(@"c:\Mame\emulator\mame.exe", "mslug.zip"); 

它的行爲與以前的嘗試相同。

如果我不嘗試傳遞參數,程序啓動正常,只是告訴我沒有ROM。上述任何一種傳遞參數的方法都會產生一個快速的命令提示符blip,顯示它在rom的zip文件爲空時顯示的相同信息。

從我讀過的關於Process.Start之類的東西,我上面輸入的東西應該等同於打開命令行並輸入我開始這篇文章的命令。但如果是這種情況,那麼這應該沒有問題。我不確定我是否做錯了什麼,或者有更好的方法去解決這個問題。

注意:我還瀏覽了Windows GUI並創建了mame.exe的快捷方式,並編輯了它的屬性以將mslug.zip作爲參數傳遞,並且它也可以工作,所以它不需要通過它來完成就我所知道的命令行而言。

作爲一種幫助,我在應用程序的gui中調試了文本框,這些文本框用我的代碼中使用的變量更新以驗證變量是否正確。

更新:
我想補充說,程序(對於那些不熟悉的)依賴於您嘗試啓動的ROM的文件名。傳遞參數mslug.zip的含義會導致程序轉到它自己的rom目錄(當前是C:\ mame \ emulator \ roms)並搜索mslug.zip。我可以從我的系統中的任何目錄運行該命令並獲得相同的結果。我也可以通過路徑到ROM像

c:\mame\emulator\mame.exe c:\mame\emulator\roms\mslug.zip 

這也將工作,無論我在哪裏運行它。我試圖在我的代碼中,通過傳遞路徑作爲變量,並通過它們傳遞給他們,如

string romSelected = @"c:\mame\emulator\roms\mslug.zip"; 

兩者都以相同的方式失敗。

+2

什麼**工作目錄**?在命令行中,你處於'mslug.zip'所在的目錄中,在你的應用程序中你處於它的工作目錄(例如'bin/debug'目錄)。 – 2015-02-05 15:35:05

+0

你有沒有嘗試谷歌搜索有很多關於如何正確執行此操作的示例以及'SO' http://stackoverflow.com/questions/15061854/how-to-pass-multiples-arguments-in- processstartinfo我想知道你是否通過了代碼並評估了所有參數和變量等。 – MethodMan 2015-02-05 15:35:44

+0

@MethodMan:你指的問題是關於多個參數。這裏只有一個。來自OP的代碼是可以的。 – 2015-02-05 15:37:37

回答

2

您使用的代碼正常工作。它確實發送正確的參數給程序。毫無疑問。

有些事情可能出錯:

  • 文件不存在;
  • 文件不存在於當前工作目錄,也就是mame正在查找的位置(您可以嘗試在命令行中使用不存在的文件名作爲測試。錯誤是否相同,那麼可能無法找到該文件。嘗試使用文件的完整路徑;
  • 一些權限問題,錯誤被程序遮住了。

由於Sinatr建議您可以使用Directory.SetCurrentDirectory設置當前工作目錄。請注意,該程序的當前工作目錄也受到影響,因此您可能需要考慮您正在做什麼。

您最好使用Process.WorkingDirectory來設置您啓動的進程的工作目錄。

+0

這就是我的想法,但模擬器實際上並不需要路徑。它旨在獲取文件名並檢查它的ROM文件夾。我可以從任何目錄運行命令並從命令行獲得相同的結果。 – Aloehart 2015-02-05 15:41:46

+2

模擬器本身的工作目錄呢?也許它找不到'rom',因爲它開始從錯誤的基本目錄搜索,因爲它是如何啓動的。嘗試[設置](https://msdn.microsoft.com/en-us/library/system.io.directory.setcurrentdirectory(v = vs.110).aspx)。 – Sinatr 2015-02-05 15:45:56

+0

@Sinatr如果你願意,繼續添加到你原來的答案,因爲這解決了問題。似乎很奇怪它會有這個問題,但我很高興學到了新的東西。非常感謝幫助:) – Aloehart 2015-02-05 15:53:44

1

只給文件名分配StartInfo.Arguments不起作用。您必須預先設置一個類似「文件」的操作。這將爲接收應用程序生成2個參數(args [0] =「 - File」,args [1] = filename)。

下面是我工作:

ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo 
{ 
    FileName = appFilename, 
    Arguments = "-File " + viewFilename, // space char after -File 
}; 
Process.Start(startInfo);