0

我有 c# 控制台应用程序(Net framework 4.5,visual studio 2010 express)。我可以使用 cmd 运行这个应用程序,它的工作正常。但是出于一些非常重要的原因,我需要从其他使用 c++ 编写的应用程序运行此应用程序。我曾尝试使用 ShellExecute、CreateProcess、WinExec 运行 c# 应用程序。它总是崩溃,并且不会在我之前使用 cmd 启动它的同一台机器上运行。是否还有任何方法可以启动这个 c# 应用程序。或者我需要用一些特殊的方式编译/组装这个 c# 应用程序吗?更新示例:

方法一

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); 

方法二

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 回答