如何查找打开自定义文件扩展名文件时触发的文件路径?

7

我如何获取用于打开程序的文件位置?

例如:如果我创建了一个新的扩展名“.xyz”,并告诉Windows我想用我的应用程序打开文件类型.xyz,那么它就会启动我的应用程序。很好,但是我的应用程序如何获取启动它的文件路径?

另外,是否有一种方法可以只保持一个版本的应用程序运行,并使打开的新文件只调用我的应用程序中的一个方法?例如,如果您正在使用Torrent并打开5个.torrent文件,则所有文件都将传递给一个应用程序。

附加问题:所有文件扩展名都是3个字母吗?是否有公开使用的扩展名列表?如果我要创建一个文件扩展名,我不想使用已经被使用的扩展名。


1
那是三个问题。 - Raedwald
2个回答

14
当您创建文件关联时,您指定了资源管理器应运行以激活您的程序的命令行。Shell也会将文档文件名放在命令行上,因此在您的程序中检查命令行参数。如何做到这一点取决于您使用的语言和开发环境。在Delphi中,可以使用ParamCountParamStr函数。
在创建文件关联时,您可以指定文档文件名应放在命令行的哪个位置。在命令行上使用%1,shell会用文件名替换它。由于Windows文件名经常包含空格,因此您应该在文件名周围加上引号,这样文件关联中的命令行就是这样的:
ArthurApp.exe "%1"
有了这个关联,双击另一个文档文件将启动程序的另一个实例。如果您想要文档在已运行的实例的另一个窗口中打开,那么您可以编写代码,在启动时使您的程序查找已经运行的实例。如果找到一个实例,那么它可以与该实例通信,告诉它要打开哪个文件。您可以使用任意数量的方式进行通信,包括邮槽、套接字、命名管道、内存映射文件和DDE。
Shell的文件关联机制已经有了一种通过DDE进行通信的方法,因此不会启动程序的第二个实例。相反,shell会与已运行的实例开始一个DDE对话,并以此告诉它新文件的名称。但是,现在DDE似乎越来越不受青睐,因此请首先检查其他选项。

关于你的附加问题,不,扩展名并不总是三个字符长。看看周围的情况,这应该是显而易见的:C代码放在.c文件中,Adobe Illustrator图形放在.ai 文件中,新的微软Word文档放在.docx文件中。

但要小心。如果你请求**.doc*,结果将包括.docx文件。这是因为FindFirstFile会匹配短文件名和长文件名,长文件名带有长文件扩展名,在其短文件名版本中具有三个字符的扩展名。


0

Rob非常完美地回答了你的问题。

至于最后一部分,是否有公共文件扩展名列表 - 并没有,但是有shell.windows.com,这是Explorer用来查找未知文件扩展名处理程序的Web服务。您可以编写一个扩展名,然后查询shell.windows.com以查看它是否已注册。例如,要检查是否有任何人在shell.windows.com上注册了扩展名.blah,只需在任何浏览器中打开此URL:

http://shell.windows.com/fileassoc/0409/xml/redir.asp?ext=blah

当然,将结尾的blah替换为您的扩展名。

您可以在KB929149和Raymond Chen的文章Where does shell.windows.com get information about file extensions, and how do I get in on that action?中找到更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接