如何通过shell打开调用Delphi程序打开多个文件

时间:2009-03-01 20:51:22

标签: delphi command-line parameters filenames

我目前正在使用:

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;

为所有文件添加右键单击打开功能。那时我想要检测

的能力
  1. 多少个文件
  2. 每个文件的路径名

4 个答案:

答案 0 :(得分:6)

除了其他一切,你应该使用%l而不是%1。这样你的程序将获得文件的完整(长)名称,而不是短文件(DOS 8.3)。

编辑:回答Rob的问题

使用Google或MSDN搜索似乎几乎不可能搜索'%l'和'%1'(包括百分号)。 :(但是,我发现了一个非常好的描述 The Old New Thing - '%1'自动检测您的程序是否支持长文件名并传递短名称或长名称。似乎所有现代系统都传递了长名称​​,除非找不到你的exe (至少我理解Raymond的暴露方式)。

如果您在评论中向下滚动(在页面上搜索'%l'),您将找到所有支持的参数列表,这些参数取自某些不再存在的页面(但我找到了一个旧版本在Internet Archive)。该页面也没有包含对Microsoft文档的引用,因此我无法为您提供权威链接:(

罗布,谢谢你的询问 - 我现在比以前更了解%1 /%l :) +1。

答案 1 :(得分:5)

如果您尝试一次打开多个文件,通常会获得已注册程序的多个实例,每个实例都会打开一个文件。

现在从你最近的问题判断

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。我没有对此进行测试,但看起来它可以正常工作。

答案 2 :(得分:0)

不确定你真正想要的是什么。但您可以通过以下方式找到参数数量:

ParamCount;

然后找到每个参数

ParamStr(1);
ParamStr(2);
ParamStr(3);

直到ParamCount。

答案 3 :(得分:0)

我注意到你只是用%1注册它。

我会在注册表中尝试%1%2%3%4%5等。

我从来没有玩过shell扩展,看看还有什么可能让它失败。我所做的只是注册文件关联,它们的行为完全符合我的预期。