用ShellExecute()和手工打开命令提示符有什么区别?

时间:2013-02-26 22:42:26

标签: c++ windows visual-c++ command-prompt shellexecute

我正在尝试通过我作为一种“Launcher”应用程序创建的Windows程序运行java程序。通常,要运行此java程序,我将运行批处理文件或直接转到cmd提示符窗口(Windows Key + R,键入“cmd”)并输入java -Xmx4096M -Dsun.java2d.noddraw=true [...]。关键是 java 似乎在此窗口中被识别。

另一方面,当我从我的应用程序启动命令提示符时,java不再“被识别为内部或外部命令,可操作程序或批处理文件。”

TCHAR szPath[MAX_PATH];
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL, 0, szPath))) {
    PathAppend(szPath, TEXT("cmd.exe"));
    ShellExecuteW( GetSafeHwnd(),L"open", szPath, NULL, NULL, 1 );
}

为什么会这样?

1 个答案:

答案 0 :(得分:3)

对于遇到此问题的未来访客,这是我的工作解决方案:

PVOID OldValue = NULL;
if( Wow64DisableWow64FsRedirection(&OldValue) )  {
        TCHAR szPath[MAX_PATH];
    if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL, 0, szPath))) {
        PathAppend(szPath, TEXT("cmd.exe"));
        ShellExecuteW( GetSafeHwnd(), L"open", szPath, NULL, NULL, 1 );
    }
    if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) ) {
        AfxMessageBox(L"A script that should never fail has failed.");
        return;
    }
}

感谢HansPassant带领我朝着正确的方向前进。