Как мне запустить командную строку "explorer / n, / select, (filename)" в c ++ builder?

Я пробовал shellexecute, я пробовал createprocess, я не могу заставить его что-либо делать.

Запуск командной строки вручную (в фактической командной строке в окне консоли) работает, но ничто из того, что я пробовал до сих пор, не запускает ее из приложения C++ Builder.

Очевидно (имя файла) - это просто заполнитель. Ему будет дано допустимое имя файла, например

проводник / n, /select,c:\123.doc

Ответов (3)

Решение

Вы используете экранированные обратные косые черты в своем имени файла? Например:;

"c:\123.doc"

должно быть:

"c:\\123.doc"

Редактировать:

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

работает для меня.

Чтобы избежать замены текущего процесса, используйте вместо него spawnlp

Я уверен, что есть способ создать CreateProcess и ShellExecute поработать с этим, но я подозреваю, что самый простой способ сделать это будет старый добрый 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.

Хорошо, эти ответы были полезны, но, к сожалению, у них обоих есть недостатки, которых я бы предпочел не иметь в своем приложении ...

execlp() вызывает закрытие вызывающего процесса.

system() показывает окно dos, которое остается, пока я не закрою окно проводника.

Тем не менее, я очень рад вашим ответам.

Мне нужно с этим поработать winexec . Хотя в файле справки winexec сказано следующее:

Примечание. Эта функция предоставляется только для совместимости с 16-битной Windows. Приложения должны использовать функцию CreateProcess.

Я не могу приступить createprocess к работе, поэтому winexec пока останусь ...

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