如何获取用于打开程序的文件的位置?
示例:如果我创建一个新的扩展".xyz"说,我告诉Windows我想用myapplication打开文件类型.xyz,然后它启动我的应用程序.很好,但我的应用程序如何处理用于启动它的文件的文件路径?
此外,有没有办法只保留我的应用程序的一个版本运行和打开的新文件只是调用我的应用程序中的方法?例如,如果您使用torrent并打开5个.torrent文件,他们只会传递给一个应用程序.
附带问题:所有文件扩展名都是3个字母长,是否有一个公开使用的列表?如果我正在创建文件扩展名,我不想使用已经使用过的文件扩展名.
创建文件关联时,指定了Explorer应运行的命令行以激活程序.shell也将文档文件的名称放在命令行中,因此在程序中检查命令行参数.如何做到这一点取决于您的语言和开发环境.在Delphi中,使用ParamCount
和ParamStr
函数.
创建文件关联时,可以准确指定文档文件名称应在命令行上的位置.%1
在命令行上使用某个地方,shell将用文件名替换它.由于Windows文件名经常包含空格,因此应在文件名周围加上引号,因此文件关联中的命令行如下所示:
ArthurApp.exe "%1"
使用该关联,双击另一个文档文件将启动程序的另一个实例.如果您希望在已经运行的实例的另一个窗口中打开文档,那么您可以编写代码以使程序在启动时查找已经运行的实例.如果找到一个,那么它可以与该实例通信以告诉它要打开哪个文件.您可以通过多种方式实现该通信,包括邮件槽,套接字,命名管道,内存映射文件和DDE.
shell的文件关联机制已经有了通过DDE进行通信的方式,因此程序的第二个实例根本不会启动.相反,shell将启动与已经运行的实例的DDE对话,并以这种方式告诉它新的文件名.然而,DDE似乎现在已经失宠了,所以首先查看一些其他选项.
对于你的问题,不,扩展名并不总是三个字符.环顾四周,这应该是显而易见的:C代码进入.c文件,Adobe Illustrator图形进入.ai文件,新的Microsoft Word文档进入.docx文件.
但要注意.如果你要求**.doc*,结果将包括.docx文件.这是因为FindFirstFile
匹配短文件名和长文件名,具有长文件扩展名的长文件名在其短文件名版本中具有三个字符的扩展名.