Shell 如何在C++ Builder中运行命令行“资源管理器/N,/选择,文件名”?

Shell 如何在C++ Builder中运行命令行“资源管理器/N,/选择,文件名”?,shell,command-line,c++builder,Shell,Command Line,C++builder,我试过shellexecute,我试过createprocess,我似乎什么都做不了 在控制台窗口中的实际命令提示符下手动运行命令行,但到目前为止,我没有尝试过从C++ Builder应用程序运行它。 显然,文件名只是一个占位符。它将被赋予一个有效的文件名,例如 explorer/n,/select,c:\123.doc文件名中是否使用转义反斜杠?例如: "c:\123.doc" 应该是: "c:\\123.doc" 编辑: 对我有用 为了避免替换当前进程,请改用spawnlp。我确信有某种

我试过shellexecute,我试过createprocess,我似乎什么都做不了

在控制台窗口中的实际命令提示符下手动运行命令行,但到目前为止,我没有尝试过从C++ Builder应用程序运行它。

显然,文件名只是一个占位符。它将被赋予一个有效的文件名,例如


explorer/n,/select,c:\123.doc

文件名中是否使用转义反斜杠?例如:

"c:\123.doc"
应该是:

"c:\\123.doc"
编辑:

对我有用


为了避免替换当前进程,请改用spawnlp。我确信有某种方法可以使CreateProcess和ShellExecute与此一起工作,但我认为最简单的方法是使用好的旧系统,例如systemexplorer/n,/select,c:\\123.doc

就因为它让我感到困扰,我继续写了一个简单的程序,用CreateProcess实现了这一点:

 #define UNICODE
 #include <windows.h>
 #include <string>

 void SimpleWriteConsole(std::wstring msg) {
    DWORD written = 0;
    WriteConsole( GetStdHandle(STD_OUTPUT_HANDLE),
          msg.c_str(), msg.length(), &written, NULL);
 }


 int wmain(int argc, wchar_t **argv, wchar_t **envp) {
    SimpleWriteConsole(L"Opening explorer...\n");
    std::wstring commandLine = L"explorer /n, /select,";
    if( argc < 2 ) {
       SimpleWriteConsole(L"Please include a file to select.\n");
       return EXIT_FAILURE;
    }
    commandLine += argv[1];
    STARTUPINFO startupInfo;
    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    PROCESS_INFORMATION procInfo;

    if( ! CreateProcess(NULL, const_cast<wchar_t*>(commandLine.c_str()), 
             NULL, NULL, 0, 0, NULL, NULL, &startupInfo, &procInfo) ) {
       SimpleWriteConsole(L"Couldn't create process :(\n");
       return EXIT_FAILURE;
    }
    CloseHandle( procInfo.hThread );
    CloseHandle( procInfo.hProcess );
    SimpleWriteConsole(L"Hooray launched explorer.\n");
    return EXIT_SUCCESS;
 }

它将C:\abc.txt部分作为命令行上的参数。没有额外的dos框,也不会吃掉你现有的process exec应该这样做,顺便说一句,它也没有使用不推荐的API。

好的,这些回复很有用,但不幸的是,它们都有我不希望在我的应用程序中出现的缺点

execlp导致调用进程关闭

系统显示一个dos框,直到我关闭资源管理器窗口为止

不过我很感谢你的回答

我要和winexec合作。尽管winexec的帮助文件中说-

注:此功能仅用于与16位兼容 窗户。应用程序应使用CreateProcess函数

我无法让createprocess正常工作,所以我现在将继续使用winexec

WinExec(String("explorer /n, /select,"+ FileName).c_str(),SW_SHOWDEFAULT);

文件名字符串由内置的文件处理组件处理,因此它会自动使用双反斜杠实现。但这两种类型都不起作用。我两个都试过了。另一个想法——它不应该是目录名,而不是文件名吗?你的编辑EXCLP对我有用。必须包含进程头,但这不是问题。谢谢我当时正忙得不可开交,当我决定回到这里的时候,我差点让createprocess工作了。我想了想。execlp可以工作,但它会终止调用进程!可以工作,但会打开dos框。我宁愿不要那个。
WinExec(String("explorer /n, /select,"+ FileName).c_str(),SW_SHOWDEFAULT);