【问题标题】:How do I run command line "explorer /n, /select,(filename)" in c++ builder?如何在 c++ builder 中运行命令行“explorer /n, /select,(filename)”?
【发布时间】:2009-03-01 00:15:05
【问题描述】:

我试过 shellexecute,我试过 createprocess,我似乎无法让它做任何事情。

手动运行命令行(在控制台窗口中的实际命令提示符处)是可行的,但到目前为止我尝试过的任何操作都无法从 c++ builder 应用程序中运行它。

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

资源管理器 /n, /select,c:\123.doc

【问题讨论】:

    标签: shell command-line c++builder


    【解决方案1】:

    您是否在文件名中使用了转义的反斜杠?例如:;

    "c:\123.doc"
    

    应该是:

    "c:\\123.doc"
    

    编辑:

      execlp("explorer", "/n, /select,c:\\foo.txt", 0)
    

    为我工作。

    为避免替换当前进程,请改用 spawnlp

    【讨论】:

    • 文件名字符串由内置文件处理组件处理,因此它会自动使用双反斜杠实现。但两种类型都不起作用。我都试过了。
    • 另一个想法 - 它不应该是目录名,而不是文件名吗?
    • 您的编辑 (execlp) 对我有用。必须包含进程标题,但这不是问题。谢谢!当我决定回到这里查看时,我正在撕扯我的头发,并且我几乎已经创建了工作。
    • 重新考虑。 execlp 可以工作,只是它会杀死调用进程!
    【解决方案2】:

    我确信有某种方法可以使 CreateProcessShellExecute 与此一起使用,但我怀疑最简单的方法将是旧的 system,例如system("explorer /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 框,不会占用您现有的进程(exec 应该这样做,顺便说一句),并且它不使用已弃用的 API。

    【讨论】:

    • 有效,但打开了一个dos框。我宁愿没有那个。
    【解决方案3】:

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

    execlp() 导致调用进程关闭。

    system() 显示一个 dos 框,它会一直保留到我关闭资源管理器窗口。

    不过,我很感谢你的回答。

    我可以使用 winexec。即使 winexec 的帮助文件这么说 -

    注意 提供此功能仅用于兼容 16 位 视窗。应用程序应使用 CreateProcess 函数。

    我无法让createprocess 工作,所以我现在要坚持使用winexec...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2021-01-08
      • 2021-12-16
      • 2017-11-22
      • 2020-06-08
      相关资源
      最近更新 更多