Как вы можете открыть файл с программой, связанной с расширением файла? - PullRequest
17 голосов
/ 02 февраля 2012

Есть ли простой способ открыть файл связанной программой в windows?(как двойной щелчок по нему в проводнике Windows, но выполняется автоматически с моим кодом)

Например, на компьютере A текстовый файл text.txt будет открыт в WordPad, а на компьютере B он будет открыт Notepad ++ из-запользовательские расширения файлов.

Я пробовал ShellExecute

ShellExecute(0, L"open", L"c:\\windows\\notepad.exe" ,L"c:\\outfile.txt" , 0 , SW_SHOW );

, который работает, но если я опускаю параметр notepad.exe, происходят странные вещи (показывается случайный проводник).

Ответы [ 6 ]

25 голосов
/ 02 февраля 2012

Вы хотите использовать файл для открытия в качестве аргумента файла, а не аргумента параметра.Нет необходимости указывать, какую программу использовать, ShellExecute найдет ее для вас.

ShellExecute(0, 0, L"c:\\outfile.txt", 0, 0 , SW_SHOW );

Оставив глагол как NULL (0) вместо L"open", вы получите истинное действие по умолчанию длятип файла - обычно это open, но не всегда.

3 голосов
/ 02 февраля 2012

См. Запуск приложений :

ShellExecute(NULL, "open", L"c:\\outfile.txt", NULL, NULL, SW_SHOW);

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

2 голосов
/ 12 августа 2015

Немного больше возможностей здесь:

Если вы хотите открыть - например - файл по умолчанию с помощью 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);
2 голосов
/ 02 февраля 2012

Согласно Базе знаний MS , ShellExecute должен работать (мы делаем это в Delphi все время):

ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL)
1 голос
/ 02 февраля 2012

Если lpFile указывает файл документа, флаг просто передается соответствующее приложение

Таким образом, вам нужно заменить "c:\\windows\\notepad.exe" фактическим файлом, который вы хотите открыть, и оставить lpParameters null.

0 голосов
/ 02 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...