Подтвердить что ты не робот

Как открыть файл с программой, связанной с расширением файла?

Есть ли простой способ открыть файл по связанной с ним программе в 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, происходят странные вещи (показан случайный проводник).

4b9b3361

Ответ 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

Может быть, попробуйте начать, а не открывать?