如何打开多个文件并通过shell开放
我目前使用的德尔福调用程序:如何打开多个文件并通过shell开放
if ParamStr(1)<>'%1' then
begin
address.Text:=ParamStr(1);
autoconfigfile;
end;
拿起这是用来通过文件关联到打开该文件的文件名。
我现在想开发对多个文件进行操作的能力。 也就是说如果我选择5个文件并右键单击并选择使用“EncryptionSystem”打开。 我有注册表项:
reg.OpenKey('*\shell\Encrypt\command', true);
reg.WriteString('','C:\Program Files\EncryptionSystem\EncryptionSystem.exe "%1"');
reg.CloseKey;
要添加一个右击打开的能力,所有文件。那么我想的能力来检测
- 多少文件
- 每个文件
如果您尝试一次打开多个文件,您通常会获得注册程序的多个实例,每个实例都打开其中一个文件。
现在从你最近的问题来看
How do i tell if one instance of my program is running?
How do I send a string from one instance of my Delphi program to another?
你不希望允许该程序的多个实例,所以你要么需要重新考虑设计决策,或实现的一个第二个问题的答案中概述的方法将第二个实例的命令行参数发送给第一个实例。请注意,时间在这里很重要,因为第一个实例可能还没有准备好从其他实例接收数据。特别是使用主窗体的窗口句柄的解决方案,或者某种形式的基于管道或文件的通信机制将涉及等待第一个实例准备就绪。因此,简单地允许程序的多个实例可能容易得多。
您可能还想研究this Microsoft Knowledge Base entry或搜索有关DDE执行命令的更多信息。
编辑:您也可以尝试用“%*”,而不是“%1”中的注册表项,如中提到的“旧的新”的评论the answer by gabr详细说明。我没有测试过这个,但它看起来可以工作。
%*看起来是我想要的一个,当我回家时会测试它,这是否提供了“〜”的长名称或dos 8.3版本 – Arthur 2009-03-03 15:42:44
不知道你真正想要什么的路径名。但你可以找到的参数与号码:
ParamCount;
每个参数是然后用
ParamStr(1);
ParamStr(2);
ParamStr(3);
直到ParamCount发现。
paramcount传递的参数数加在文件名的末尾.. apon打开5个文件只有1个参数。 – Arthur 2009-03-01 22:24:17
我注意到你只注册了%1。
我会尝试在注册表中%1%2%3%4%5等。
我从来没有玩过shell扩展,看看还有什么可能导致失败。我所做的只是注册文件关联,它们的行为完全如我所料。
除了其他所有内容,您应该使用%l而不是%1。这样你的程序将得到一个完整的(长)文件名,而不是简短的(DOS 8.3)。
编辑:在评论
的答案罗布的问题看来,这几乎是不可能的搜索“%L”和“%1”(包括百分号)或者使用谷歌或MSDN搜索。 :(但是,我在 The Old New Thing - '%1'中发现了一个相当不错的描述,它可以自动检测你的程序是否支持长文件名并传递了短名或长名,似乎所有现代系统都会传递长名,除非找不到exe文件(至少我是这么理解雷蒙德的曝光)
如果你在评论中进一步向下滚动(在页面上搜索'%l'),你会找到所有支持参数的列表, (但我在Internet Archive中发现了一个旧副本)该页面不包含任何对Microsoft文档的引用,所以我不能给你一个权威链接:(
罗布,感谢问 - 我现在对%1 /%l的了解比以前更多:) +1。
我发现答案只是没有使用dde作为初始位,因为如果所有实例一起调用,第一个实例不会从第二个实例收回消息。给我自己的共享内存空间实施这个工作很好。 – Arthur 2009-03-04 09:40:27
不是一个答案,但同样的问题: 我没有列入我的注册表文件的扩展名,但是当我在一个窗口中选择多个文件,并使用“打开方式”选择我的程序打开它们,命令行似乎只包含一个文件名。你知道如何找到其他文件名吗? Dave S – 2011-01-23 17:15:12