2

我目前正在使用:

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

4 回答 4

6

除此之外,您应该使用 %l 而不是 %1。这样,您的程序将获得文件的完整(长)名称,而不是短名称(DOS 8.3)。

编辑:在评论中回答 Rob 的问题

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

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

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

于 2009-03-02T06:58:01.967 回答
5

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

现在从你最近的问题来看

如何判断我的程序的一个实例是否正在运行?
如何将字符串从我的 Delphi 程序的一个实例发送到另一个实例?

您不希望允许程序的多个实例,因此您需要重新考虑该设计决策,或实施第二个问题的答案中概述的方法之一,以发送程序辅助实例的命令行参数到一审。请注意,时间在这里很重要,因为第一个实例可能还没有准备好从其他实例接收数据。尤其是使用主窗体的窗口句柄或某种形式的基于管道或文件的通信机制的解决方案将涉及等待第一个实例准备好。因此,简单地允许程序的多个实例可能会容易得多。

您可能还想查看此 Microsoft 知识库条目或搜索有关DDE 执行命令的更多信息。

编辑:您也可以尝试在注册表项中使用“%*”而不是“%1”,如gabr提到的答案的“旧新事物”评论中所述。我还没有测试过这个,但它看起来可以工作。

于 2009-03-02T05:21:08.563 回答
0

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

ParamCount;

然后找到每个参数

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

直到 ParamCount。

于 2009-03-01T21:21:10.730 回答
0

我注意到您只是在 %1 注册它。

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

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

于 2009-03-02T01:36:01.427 回答