Как открыть файл с программой, связанной с расширением файла?
Есть ли простой способ открыть файл по связанной с ним программе в Windows?
(например, дважды щелкнуть по нему в проводнике Windows, но автоматически выполнил мой код)
Например, на компьютере A "text.txt" будет открыт в текстовом поле, но на компьютере B он будет открыт Notepad ++ из-за назначений расширения файлов пользователей.
Я попробовал ShellExecute
ShellExecute(0, L"open", L"c:\\windows\\notepad.exe" ,L"c:\\outfile.txt" , 0 , SW_SHOW );
но если я опускаю параметр notepad.exe, происходят странные вещи (показан случайный проводник).
Ответы
Ответ 1
Вы хотите использовать файл для открытия в качестве аргумента файла, а не аргумента параметра. Не нужно указывать, какую программу использовать, ShellExecute
будет искать ее для вас.
ShellExecute(0, 0, L"c:\\outfile.txt", 0, 0 , SW_SHOW );
Если оставить глагол как NULL (0), а не L"open"
, вы получите истинное действие по умолчанию для типа файла - обычно это open
, но не всегда.
Ответ 2
См. Запуск приложений:
ShellExecute(NULL, "open", L"c:\\outfile.txt", NULL, NULL, SW_SHOW);
В окнах хороший крючок памяти должен думать о том, что все файлы данных исполняются оболочкой. Вы также можете попробовать его в командной строке, где вы можете просто ввести имя файла, и оно будет открыто. Или, наоборот, каждый файл в Windows может быть открыт, и действие открытия по умолчанию для исполняемых файлов заключается в их выполнении.
Ответ 3
Если lpFile указывает файл документа, флаг просто передается в связанное приложение
Итак, вам нужно заменить "c:\\windows\\notepad.exe"
на фактический файл, который вы хотите открыть, и оставить lpParameters
null.
Ответ 4
В соответствии с базой знаний MS, ShellExecute должен работать (мы делаем это в Delphi все время):
ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL)
Ответ 5
Здесь немного возможностей:
Если вы хотите открыть, например, файл по умолчанию с помощью Notepad ++ (если он установлен), вы можете сканировать его раздел реестра, если он существует и где он находится (обычно HKLM\SOFTWARE\Wow6432Node\Notepad++
[проверено Win7]), затем этот путь и откройте его.
std::wstring file = L"C:\\Outfile.txt";
if (NotepadPlusPlusExists()) //Open with Notepad++ or use an other program... (maybe your own ?)
{
std::wstring wsNPPPath = GetNotepadPlusPlusPath();
ShellExecuteW(HWND, L"open", wsNPPPath.c_str(), file.c_str(), NULL, SW_NORMAL);
}
else //Open with default associated program <---
ShellExecuteW(HWND, NULL, file.c_str(), NULL, NULL, SW_NORMAL);
Если вы хотите, чтобы пользователь мог изменить программу по умолчанию или выбрать программу, которую он хочет использовать, вы можете открыть диалог "Открыть с".
//std::wstring StringArgsW(const wchar_t *format, ...);
std::wstring wsCmdOpenWith = StringArgsW(L"C:\\Windows\\system32\\shell32.dll,OpenAs_RunDLL \"%s\"", file.c_str());
ShellExecuteW(HWND, L"open", L"C:\\Windows\\system32\\rundll32.exe", wsCmdOpenWith.c_str(), NULL, SW_NORMAL);
Вы также можете открыть файл в проводнике.
std::wstring wsCmdExplorer = StringArgsW(L"/select,\"%s\"", file.c_str());
ShellExecuteW(HWND, L"open", L"explorer.exe", wsCmdExplorer.c_str(), NULL, SW_NORMAL);
Ответ 6
Может быть, попробуйте начать, а не открывать?