7

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

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

另外,有没有办法让我的应用程序的一个版本只运行并打开新文件以调用我的应用程序中的方法?例如,如果您使用 torrent 并打开 5 个 .torrent 文件,它们都只会传递给一个应用程序。

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

4

2 回答 2

14

创建文件关联时,您指定了 Explorer 应该运行的命令行来激活您的程序。shell 也将文档文件的名称放在命令行上,因此在您的程序中,检查命令行参数。你如何做到这一点取决于你的语言和开发环境。在 Delphi 中,使用ParamCountParamStr函数。

创建文件关联时,您可以在命令行上准确指定文档文件名的位置。在命令行的某处使用%1,shell 将用文件名替换它。由于 Windows 文件名经常包含空格,因此您应该在文件名周围加上引号,因此文件关联中的命令行如下所示:

ArthurApp.exe "%1"

通过该关联,双击另一个文档文件将启动程序的另一个实例。如果您希望在已运行实例的另一个窗口中打开文档,则可以编写代码使程序在启动时查找已运行实例。如果它找到一个,那么它可以与那个实例通信,告诉它要打开什么文件。您可以通过多种方式实现这种通信,包括邮槽、套接字、命名管道、内存映射文件和 DDE。

shell 的文件关联机制已经有一种通过 DDE 进行通信的方式,因此您的程序的第二个实例根本不会启动。相反,shell 将与已经运行的实例开始一个 DDE 对话,并以这种方式告诉它新的文件名。但是,现在 DDE 似乎已失宠,因此请先查看其他一些选项。

对于您的附带问题,不,扩展名并不总是三个字符长。环顾四周,这应该很明显:C 代码放在.c文件中,Adobe Illustrator 图形放在.ai文件中,新的 Microsoft Word 文档放在.docx文件中。

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

于 2009-01-19T21:03:50.987 回答
0

Rob 很好地回答了您的问题。

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

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

当然,blah用您的扩展名替换尾随。

您可以在KB929149和 Raymond Chen 的文章Shell.windows.com 在哪里获取有关文件扩展名的信息以及如何参与该操作?.

于 2009-01-20T00:25:56.320 回答