C++ 为什么程序可以从命令行运行,使用Shellexecuteex它也可以运行,但使用CreateProcess它不运行';不行?

C++ 为什么程序可以从命令行运行,使用Shellexecuteex它也可以运行,但使用CreateProcess它不运行';不行?,c++,windows,winapi,createprocess,C++,Windows,Winapi,Createprocess,有一个程序“prog.exe”。它可以从命令行运行: C:\Folder\prog.exe“D:\3.7.7\File.XML”。我正在尝试使用CreateProcess做同样的事情。程序冻结,抛出带有错误的模式窗口,并因超时而终止 我尝试使用ShellExecuteEx运行。程序正常运行并正确完成。但是我不能使用ShellExecuteEx,因为文件关联有问题(错误代码1155) 有两个问题: 1.为什么程序可以从命令行运行,使用ShellExecuteEx它也可以运行,但是使用CreateP

有一个程序“prog.exe”。它可以从命令行运行:
C:\Folder\prog.exe“D:\3.7.7\File.XML”
。我正在尝试使用
CreateProcess
做同样的事情。程序冻结,抛出带有错误的模式窗口,并因超时而终止

我尝试使用
ShellExecuteEx
运行。程序正常运行并正确完成。但是我不能使用
ShellExecuteEx
,因为文件关联有问题(错误代码1155)

有两个问题:
1.为什么程序可以从命令行运行,使用
ShellExecuteEx
它也可以运行,但是使用
CreateProcess
它不工作?我可能做错什么了吗?
2.为什么显示程序模式窗口?为什么不隐藏?为什么忽略标志:

si.dwFlags = STARTF_USESHOWWINDOW;  
si.wShowWindow = SW_HIDE;
但当我运行另一个程序时,这些标志会起作用并隐藏GUI

STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
std::string cmd_line = "C:\\Folder\\prog.exe \"D:\\3.7.7\\File.XML\"";
const char *ss = (cmd_line.c_str());
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

LPSTR lp_str = const_cast<char *> (ss);
if (!CreateProcess(NULL, lp_str, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi))
{
    std::ofstream  fs("D:\\3.7.7\\log.txt");
    fs << " Can't run prog.exe! ErrorCode: " << GetLastError();
    fs.close();
}
std::ofstream  fs("D:\\3.7.7\\log.txt");
fs << "Run correctly \n";

switch (WaitForSingleObject(pi.hProcess, 20000))
{
case WAIT_OBJECT_0:
    return;

case WAIT_TIMEOUT:
    TerminateProcess(pi.hProcess, 0);
    CloseHandle(pi.hProcess);
    fs << " Waiting to long. Terminate process ";
    break;

case WAIT_FAILED:
    fs << " Waiting failed. ErrorCode: " << GetLastError();
    break;
}
fs.close(); 
startupinfosi;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
处理信息;
std::string cmd_line=“C:\\Folder\\prog.exe\”D:\\3.7.7\\File.XML\”;
常量char*ss=(cmd_line.c_str());
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=SW_HIDE;
LPSTR lp_str=常量(ss);
if(!CreateProcess(NULL,lp_str,NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi))
{
流fs的std::of(“D:\\3.7.7\\log.txt”);

fs您应该显示实际代码,而不是这个伪代码。这样我们就可以看到您实际传递给
CreateProcess
的内容,而不必猜测
ss
是什么。您使用
const_cast
应该是一个很大的警告信号。如果某个内容不是
const
,那么应用
const_cast
不会有任何问题不要这样做!由于实现的特殊性,您可能会使用
CreateProcessA
解决这个问题,但这是一个非常坏的习惯。此外,如果遇到错误,您必须告诉我们该错误的详细信息。确保我们有与您一样多的信息,以及与您相同的代码。正在运行的程序的行为是否正常取决于工作目录?您可以在程序运行的开始时尝试C++语句< COD>代码>调试代码(),在使用<代码> CurATEPATION<代码>运行之后,调试它,看看它出了什么错。我认为您希望它在隐藏模式下运行控制台程序,使用<代码> CuraTeals</C>。(请参见
CREATE\u NO\u WINDOW
CreateProcess()
报告的实际错误是什么?模式窗口实际上是什么样子的?当
CreateProcess()
失败时,您正在调用
GetLastError()
太晚了。您必须在执行任何其他操作之前调用它。但是您在调用
GetLastError()
之前打开了一个文件,因此打开该文件的行为可以清除由
CreateProcess()
设置的错误代码。此外,您的代码仍在继续其成功逻辑(记录“正确运行”)如果
CreateProcess()
失败,则等待
hProcess
),这显然是错误的。