应该采取什么措施代替MDI应用程序的ddeexec?

时间:2010-05-19 21:20:19

标签: c++ winapi windows-shell file-association

我们一直在使用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的意图?

1 个答案:

答案 0 :(得分:1)

当您使用IDropTarget时,它会模拟拖放(XP及更高版本,您必须在旧系统上使用DDE或其他任何东西)

幸运的是,Raymond Chen最近使用示例代码对IDropTarget做了blog post