我有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发送报告。
答案 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";