如何使用与其文件扩展名相关联的程序打开文件?

时间:2012-02-02 16:03:52

标签: c++ windows

是否有一种简单的方法可以通过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 个答案:

答案 0 :(得分:25)

您希望使用该文件作为文件参数打开,而不是参数参数。无需指定使用哪个程序,ShellExecute将为您查找。

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

通过将动词保留为NULL(0)而不是L"open",您可以获得文件类型的真正默认操作 - 通常这是open,但并非总是如此。

答案 1 :(得分:3)

请参阅Launching Applications

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

在Windows上,一个好的内存钩子就是想到shell可以执行的所有数据文件。您也可以在命令框中尝试它,您只需键入文件名,它就会被打开。或者,反过来说,Windows中的每个文件都可以打开,可执行文件的默认打开操作就是执行它们。

答案 2 :(得分:2)

根据MS Knowledge Base,ShellExecute应该可以工作(我们一直在Delphi中这样做):

ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL)

答案 3 :(得分:2)

这里有更多可能性:

如果你想打开 - 例如 - 文件默认使用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);

如果您希望用户能够更改默认程序或选择他/她想要使用的程序,您可以打开&#34;打开&#34;对话框。

//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);

答案 4 :(得分:1)

  

如果lpFile指定了一个文档文件,那么该标志就会被传递给   相关申请

因此,您需要将"c:\\windows\\notepad.exe"替换为您要打开的实际文件,并将lpParameters保留为空。

答案 5 :(得分:0)

也许尝试开始而不是开启