Как мне запустить командную строку "explorer / n, / select, (filename)" в c ++ builder?
Я пробовал shellexecute, я пробовал createprocess, я не могу заставить его что-либо делать.
Запуск командной строки вручную (в фактической командной строке в окне консоли) работает, но ничто из того, что я пробовал до сих пор, не запускает ее из приложения C++ Builder.
Очевидно (имя файла) - это просто заполнитель. Ему будет дано допустимое имя файла, например
проводник / n, /select,c:\123.doc
Ответов (3)3
Я уверен, что есть способ создать 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);