0

我正在构建一个应用程序(一个可能不止一次获得stackoverflow社区帮助的辅助项目),它需要打开各种文件类型(即在Word中打开Word文档,而不是在我的应用程序中本机)。

我一直在使用一些代码来查找注册表中文件类型的默认应用程序并将其传递给 Process.Start()。这种方法似乎有两个问题:

1) 在某些情况下引用应用程序名称,而在其他情况下不引用。
2) Process.Start() 要求应用程序路径及其参数分别传递(即 Process.Start("notepad.exe", @"C:\myfile.txt"); 而不是 Process.Start(@"notepad .exe C:\myfile.txt");)。

这意味着当我从注册表中检索路径时,我必须拆分它(在确定是否需要拆分引号或空格之后)以确定哪些部分是应用程序路径以及哪些部分是参数,然后将它们分别传递给 Process。开始()。

另一种方法似乎是只传递文件名,如 Process.Start(@"C:\myfile.txt"),但我认为这仅在应用程序位于 Path 环境变量中时才有效。

哪种方式更好?在注册表的情况下,如何进行参数解析是否有通用解决方案?

感谢您的任何帮助!

更新:
我想简短的回答是“不”。
似乎我真的走的是矫枉过正的路线,只要注册表中有关联的值,只传递文件名就可以工作。即我自己在注册表中找到的任何东西,Process.Start() 已经知道该怎么做。

我确实发现,当我使用“新”文件类型尝试此操作时,我得到一个 Win32Exception 说明“没有应用程序与此操作的指定文件相关联”。Fredrik Mörk 在评论中提到这在 Vista 中不会发生在他身上。处理这个问题的正确方法是什么?

4

3 回答 3

5

如果扩展程序注册为使用某个应用程序打开,则不需要在 PATH 中即可运行。

于 2009-05-20T06:21:36.430 回答
2

如果您只指定文件名,则应用程序不需要位于 PATH 中。以下代码对我来说很好:

            System.Diagnostics.Process.Start(@"C:\Users\Dan\Desktop\minors.pdf");
于 2009-05-20T06:24:19.750 回答
0

您通常不需要在程序中查找已注册的类型,并且程序通常不需要位于 PATH 环境变量中。通常注册表中的命令包含完整路径。这是 .kml 文件 (Google Earth) 的命令的外观(在我的计算机中):

C:\Program Files\Google\Google Earth\googleearth.exe "%1"

鉴于此,您可以安全地Process.Start与文档文件名一起使用。如果文件类型未注册,您将为此调用默认的 Windows 行为(询问您要使用哪个程序,等等)。

于 2009-05-20T06:29:51.783 回答