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

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

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

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

有帮助吗?

解决方案

创建文件关联时,您指定了资源管理器应运行以激活程序的命令行。shell 也会将文档文件的名称放在命令行上,因此在您的程序中, 检查命令行参数. 。如何执行此操作取决于您的语言和开发环境。在 Delphi 中,使用 ParamCountParamStr 功能。

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

ArthurApp.exe "%1"

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

shell 的文件关联机制已经有一种通过 DDE 进行通信的方式,因此程序的第二个实例根本不会启动。相反,shell 会与已经运行的实例启动 DDE 对话,并以这种方式告诉它新的文件名。然而,DDE 如今似乎已经不再受欢迎,因此请先查看其他一些选项。

对于你的附带问题,不,扩展名并不总是三个字符长。环顾四周,这应该是显而易见的:C代码进去 。C 文件、Adobe Illustrator 图形进入 。人工智能 文件和新的 Microsoft Word 文档进入 .docx 文件。

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

其他提示

罗布所覆盖的问题的答案(多个)精美。

至于最后部分,是否有文件扩展名的公开名单 - 不是这样的,但有shell.windows.com,Web服务Explorer用来查找未知的文件扩展名的处理程序。您可以组成一个扩展,然后查询shell.windows.com,看看是否它被注册。例如,要检查是否延长.blah已经注册通过shell.windows.com任何人,只是在任何浏览器中打开这个网址:

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

当然,与您的扩展替换后blah

您可以找到有关这 KB929149 和Raymond Chen的岗位的哪里shell.windows.com获取有关文件扩展名的信息,我该怎么办获得上行动?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top