我们一直在使用ddeexec注册表项来处理从资源管理器中打开设计。
MSDN(约2/3进入文章)表示不推荐使用ddeexec,应用程序应该使用IDropTarget。
我不清楚这实际上是如何起作用的。
e.g。如果我有Foo.exe,它用于处理.foo文件,注册表是什么样的?
HKCR\.foo
(default) = Foo.foo.1
HKCR\Foo.foo.1
shell
open
command
(default) = ?????
如果命令设置为显而易见的:
"C:\Program Files\Foo Corp\Foo.exe" "%1"
然后每次用户双击时都会启动Foo.exe,或者从上下文菜单中选择打开.foo文件。
但是,这意味着会为用户尝试启动的每个文件启动单独的Foo.exe实例。 YUCK。
我当然可以编写自定义代码,以某种方式将文件名从Foo.exe的第二个实例传递回Foo.exe的第一个实例,然后退出...但是我正在编写一些自定义代码。
DDE用于通过询问已经运行的第一个Foo.exe实例来打开指定的文件来正常处理(足够)。这使得MDI应用程序可以轻松地处理打开多个文档,其中每个文档都在Foo.exe的一个实例中打开。
如果不推荐使用DDE,那么首选机制是什么?我们的应用程序作为MDI应用程序更有意义 - 我们当然不希望运行几个Foo.exe实例(这只会让我们的用户烦恼)。我当然不希望编写一个新的Foo-Shim.exe来查找Foo.exe的真实实例,并使用一些自定义机制来传递打开的文件名。 (我不能仅仅为了这个目的而使用Foo.exe,因为Foo.exe很大,加载速度慢,并且需要一个按实例计算的激活安全代码,因此如果你在,则可能拒绝启动你的最大并发用户数限制。)
我在IDropTarget中看不到任何与此(常见)场景有任何关系的内容。
有谁知道MS的意图?
答案 0 :(得分:1)
当您使用IDropTarget时,它会模拟拖放(XP及更高版本,您必须在旧系统上使用DDE或其他任何东西)
幸运的是,Raymond Chen最近使用示例代码对IDropTarget做了blog post。