使用shellExecute运行c#console应用程序

时间:2013-01-14 22:31:33

标签: c# c++ .net visual-studio-2010 console-application

我有c#console应用程序(Net framework 4.5,visual studio 2010 express)。我可以使用cmd运行此应用程序并正常工作。但有一些非常重要的原因,我需要从其他应用程序运行这个应用程序,写在c ++上。我曾尝试使用ShellExecute,CreateProcess,WinExec来运行c#app。它始终崩溃,并且不使用cmd在我之前启动它的同一台机器上运行。还有什么方法可以启动这个c#app。或者需要我用一些特殊的方式编译/组装这个c#app? Uppdate 例如:

方法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发送报告。

1 个答案:

答案 0 :(得分: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";