0

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

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

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

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

4

3 回答 3

2

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

"c:\123.doc"

应该:

"c:\\123.doc"

编辑:

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

为我工作。

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

于 2009-03-01T00:18:28.253 回答
0

我确信有某种方法可以制作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。

于 2009-03-01T00:33:24.597 回答
0

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

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

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

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

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

注意 提供此功能仅是为了与 16 位 Windows 兼容。应用程序应使用 CreateProcess 函数。

我不能createprocess去上班,所以我要坚持winexec现在...

WinExec(String("explorer /n, /select,"+ FileName).c_str(),SW_SHOWDEFAULT);
于 2009-03-01T02:03:04.537 回答