0

所以 - 最近我遇到了一些问题,以确定从哪种方式调用程序,如果两次参数相同 - 比如:/something /something。我在运行时将图标与程序相关联,我可以使用 cmd 来调用它,但是,每当我双击关联文件(带有图标)时,程序就会打开,但不会调用所需的 rotine,因为我没有必要的触发器/属性/参数如果执行是双击而不是运行...> appname.exe /something /something。

你能举个简单的例子吗?或者理论上写所有需要的功能等。

目前,您可以猜到,我使用 ParamStr / ParamCount / blablabla / FindCMDLineSwitch / 和其他一些功能......但是......仍然...... :(

4

2 回答 2

5

你能解释一下吗?

认为如果用户双击“mydocument.ext”的文档图标,您希望能够执行操作#1,如果他键入,您希望能够执行操作#2

appname.exe mydocument.exe

双击将使 shell 运行“打开”动词,该动词在注册表中具有关联的“命令字符串”。最好的办法是将此命令字符串设置为...

MyProgram.exe "%1" /doubleclicked

...然后在运行时检查 /doubleclicked 标志。显然,您无法阻止用户使用“/doubleclicked”选项键入命令,但这就是 shell 的工作方式。

于 2009-08-16T20:04:47.787 回答
1

正如 Roddy 所建议的,我认为参数切换是唯一可靠的解决方案。但是请注意,如果用户创建自己的快捷方式,这可能不适合您的需求。

即,如果用户在命令行中创建了一个包含一些“文档”的快捷方式,您是否希望将其视为命令行调用或“双击”。我的猜测是后者。

如果是前者,那么您可以在此处停止阅读。:)

但如果后者,那么您可能需要做更多的工作才能(更)可靠地获得您想要的行为......

这将涉及使用命令行开关来指示命令行启动,而不是双击启动,因为有多种“有效”双击的方法,但只有一种方法可以从命令行运行某些东西 - 即使用命令行!(顺便说一下,我认为 Start Menu -> Run... 是命令行启动。ymmv)

所以,如果是我,我会为应用程序创建一个命令行特定的启动器。命令行启动器实际上是一段非常简单的代码,它采用给出的命令行并简单地附加一个附加参数,然后调用实际的应用程序可执行文件:

例如

myapp 参数 1 参数 2

它只是有效地调用 ShellExecute:

myappgui 参数 1 参数 2 / cmd

我自己不会太关心有两个可执行文件,因为用户在通过 GUI 调用它时不太关心代表你的“真实”应用程序的 exe 的实际名称,因为当然 GUI 调用不涉及知道,或需要知道名称。您的文件类型关联和快捷方式等都直接指向“真实” myappgui.exe,而不是myapp.exe

您的命令行参考只是指示用户使用myapp.exe从命令行调用您的应用程序。

在应用程序中,如果它找到命令行开关,则它知道它是通过命令行启动器应用程序启动的,否则它必须是双击/GUI启动。

就您的大多数用户而言,他们甚至可能永远不需要知道其中涉及两个 exe。无论如何,您必须接受如果/当用户发现您的技术(无论您选择哪种方式)时,他们可以通过制造命令行来实现他们想要的任何目的来欺骗它。

如果这对您很重要,那么命令行启动器方法可能会降低他们发现该机制的可能性 - 知道有两个可执行文件是不够的 - 他们还需要知道您的命令行的命令行开关启动器添加 - 如果他们只是直接从命令行使用myappgui.exe,而不使用命令行启动器myapp.exe,那么它仍然会像从 GUI 启动一样响应!

另一方面,使用开关来指示GUI 启动需要将所需的开关置于“公共视图”上。

于 2009-08-17T03:52:02.657 回答