0

C# コンソール アプリケーション (Net Framework 4.5、Visual Studio 2010 Express) があります。cmd を使用してこのアプリを実行でき、正常に動作します。しかし、いくつかの非常に重要な理由により、このアプリを C++ で記述した他のアプリから実行する必要があります。ShellExecute、CreateProcess、WinExec を使用して C# アプリを実行しようとしました。これは常にクラッシュし、cmd を使用して以前に起動したのと同じマシンでは実行されません。このC#アプリを起動する方法はまだありますか? または、この C# アプリを特別な方法でコンパイル/アセンブルする必要がありますか? 更新の例:

方法 1

SHELLEXECUTEINFO ShExecInfo = {0};  
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);   
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
ShExecInfo.hwnd = NULL;  
ShExecInfo.lpVerb = NULL;  
ShExecInfo.lpFile = "C:\\PATH\\To\\THE\\APP.exe";  
ShExecInfo.lpParameters = szParameters;  
ShExecInfo.lpDirectory = NULL;  
ShExecInfoFlash.hInstApp = NULL;  
ShellExecuteEx(&ShExecInfoFlash);  
WaitForSingleObject(ShExecInfoFlash.hProcess,INFINITE); 

方法 2

PROCESS_INFORMATION pi; 
char bff[512]; 
memset(&si,0,sizeof(si)); 
si.cb=sizeof(si); 
if(!CreateProcess(NULL,szParameters,NULL,NULL,0,0,NULL,NULL,&si,&pi)) 
{ return TS_METHOD_ABORTED;} 
WaitForSingleObject(pi.hProcess,INFINITE); 
CloseHandle(pi.hProcess); 
CloseHandle(pi.hThread);

そして、いつも同じようにクラッシュします。予期せぬ事態が発生したとのことで、MS に報告するよう提案されました。

4

1 に答える 1

1

あなたがやろうとしていることを長い間 c++ でやっていなかったのですが、最近 c# でやったのです。これは半分の答えであることを知っているので、事前に申し訳ありません。C++ の ShellExecute (またはその他の方法) を使用すると、起動するプログラムの作業ディレクトリを設定できますか? これを設定しないと、起動中のプログラムがシステム フォルダーで実行されていると認識し、その結果、相対パスが間違っているためにリソースを読み込めない場合があることがわかりました。

それが役に立てば幸い。

編集:

ShellExecuteには、探しているものが含まれているようです。

例が投稿されたので、上から:

SHELLEXECUTEINFO ShExecInfo = {0};  
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);   
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
ShExecInfo.hwnd = NULL;  
ShExecInfo.lpVerb = NULL;  
ShExecInfo.lpFile = "C:\\PATH\\To\\THE\\APP.exe";  
ShExecInfo.lpParameters = szParameters;  
ShExecInfo.lpDirectory = NULL;  
ShExecInfoFlash.hInstApp = NULL;  
ShellExecuteEx(&ShExecInfoFlash);  
WaitForSingleObject(ShExecInfoFlash.hProcess,INFINITE); 

まず、notepad.exe など、動作することがわかっている別のプログラムを起動することをお勧めします。

次に、最初に言ったように、作業ディレクトリをexeに一致するように設定します。

ShExecInfo.lpFile = "C:\\PATH\\To\\THE\\APP.exe";  
ShExecInfo.lpParameters = szParameters;  
ShExecInfo.lpDirectory = "C:\\PATH\\To\\THE";  
于 2013-01-14T22:41:45.187 に答える