2015-02-05 4 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(); 

제가

I는 "mslug.zip"가변 퍼팅 모두이 시도 변수 퍼팅 모두 Mame.StartInfo.Arguments = "mslug.zip"

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

으로 상기 시도 그것의 장소에.

마지막으로 다음을 시도했습니다.

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

그리고 이전 시도와 동일하게 작동합니다.

인수를 전달하지 않으면 프로그램이 정상적으로 시작되고 롬이 없다고 알려줍니다. 위의 인수 전달 방법은 모두 rom 명령 zip 파일이 비어있는 경우 표시되는 것과 동일한 정보를 보여주는 빠른 명령 프롬프트 표시로 나타납니다.

Process.Start에 대해 읽은 내용에서 위에서 입력 한 내용은 명령 줄을 열고이 게시물을 시작한 명령을 입력하는 것과 동일해야합니다. 그러나 그러한 경우라면 이것은 아무런 문제없이 잘 작동했을 것입니다. 내가 잘못했거나 더 좋은 방법이 있는지 확실하지 않습니다.

참고 : 필자는 Windows GUI를 통해 mame.exe에 대한 바로 가기를 작성하고 mslug.zip을 인수로 전달하는 속성을 편집하여 잘 작동하므로 완료 할 필요가 없습니다. 내가 말할 수있는 한 명령 줄.

어쨌든, 변수가 올바른지 확인하기 위해 내 코드에 사용 된 변수로 업데이트되는 앱의 GUI에 디버그 텍스트 상자가 있습니다.

업데이트 :
나는 익숙하지 않은 사람들을 위해 프로그램을 실행하려고하는 ROM의 파일 이름에 의존한다고 덧붙였습니다. 인수 mslug.zip을 전달한다는 의미는 프로그램이 자신의 ROM 디렉토리 (현재 C : \ mame \ emulator \ roms)로 이동하고 mslug.zip을 검색합니다. 내 시스템의 모든 디렉토리에서이 명령을 실행하여 동일한 결과를 얻을 수 있습니다. 나는 또한 롬에 경로를 전달할 수있다.

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

그것은 내가 달리는 곳과 관계없이 작동 할 것이다. 그리고 코드 내에서 경로를 변수로 전달하고이를 전달하는 방법으로 시도했습니다.

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

둘 다 같은 방식으로 실패합니다.

+2

무엇에 대한 ** **? 커맨드 라인에서 당신은'mslug.zip'이있는 디렉토리에 있습니다. 당신의 작업 디렉토리에 있습니다 (예를 들어,'bin/debug' 디렉토리). –

+0

Google 검색을 해본 적이 있습니까? 'SO'뿐만 아니라 온라인에서도 올바르게 수행하는 방법에 대한 많은 예제가 있습니다. http://stackoverflow.com/questions/15061854/how-to-pass-multiples-arguments-in- processstartinfo 코드를 단계별로 실행하고 모든 매개 변수와 변수 등을 평가했는지 궁금합니다. – MethodMan

+0

@MethodMan : 당신이 가리키는 질문은 여러 매개 변수에 관한 것입니다. 여기에는 단지 하나만 있습니다. OP의 코드는 괜찮습니다. –

답변

2

사용하는 코드가 문제가 없습니다. 이 올바른 인수를 프로그램에 전송합니다. 의심의 여지가 없습니다.잘못 될 수

어떤 것들은 :

  • 을 존재하지 않는 파일;
  • 파일 은 현재 작업 디렉토리에 존재하지 않습니다. 즉, mame이 찾고있는 곳입니다 (명령 줄에 존재하지 않는 파일 이름을 테스트로 사용해 볼 수 있습니다.) 오류가 동일합니까? , 아마 파일을 찾을 수 없습니다. 파일의 전체 경로를 사용해보십시오;
  • 일부 사용 권한 문제는 프로그램에서 오류를 가려냅니다.

Sinatr 제안했듯이 Directory.SetCurrentDirectory을 사용하여 현재 작업 디렉토리를 설정할 수 있습니다. 이 프로그램의 현재 작업 디렉토리에도 영향을 미치므로 자신이하는 일을 고려하고 싶을 수도 있습니다.

Process.WorkingDirectory을 사용하여 시작할 프로세스의 작업 디렉토리를 설정하는 것이 좋습니다.

+0

그게 내가 생각한,하지만 에뮬레이터 실제로 경로가 필요하지 않습니다. 그것은 파일 이름을 가지고 그것의 ROM 폴더를 확인하도록 설계되었습니다. 모든 디렉토리에서 명령을 실행하고 명령 행에서 동일한 결과를 얻을 수 있습니다. – Aloehart

+2

에뮬레이터 자체 작업 디렉토리는 어떻습니까? 어쩌면'rom'을 찾을 수 없을 것입니다. 왜냐하면 잘못된 시작 디렉토리 때문에 잘못된 디렉토리에서 검색을 시작하기 때문입니다. [설정]하십시오 (https://msdn.microsoft.com/en-us/library/system.io.directory.setcurrentdirectory (v = vs.110) .aspx). – Sinatr

+0

@Sinatr 원한다면 문제를 해결 한 원래 응답에 추가하십시오. 그것이 그 문제를 가지고 있을지 모르지만 나는 새로운 것을 배웠기 때문에 기쁩니다.도와 줘서 고마워. :) – Aloehart

1

StartInfo.Arguments에 파일 이름 만 지정하면 작동하지 않습니다. -File과 같은 액션을 앞에 추가해야합니다. 수신하는 App (args [0] = "- File", args [1] = filename)에 대해 2 개의 인수가 생성됩니다.

여기에 나를 위해 일한 무엇 : 작업 디렉토리

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