Как запустить командную строку «explorer / n, / select, (filename)» в c ++ builder? - PullRequest
0 голосов
/ 01 марта 2009

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 01 марта 2009

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

"c:\123.doc"

должно быть:

"c:\\123.doc"

Edit:

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

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

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

0 голосов
/ 01 марта 2009

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

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

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

Я очень благодарен за ваши ответы.

У меня есть для работы с winexec. Хотя в справочном файле winexec сказано это -

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

Я не могу заставить createprocess работать, поэтому сейчас я буду придерживаться winexec ...

WinExec(String("explorer /n, /select,"+ FileName).c_str(),SW_SHOWDEFAULT);
0 голосов
/ 01 марта 2009

Я уверен, что есть способ заставить 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.

...