如何同时在资源管理器中打开多个文件?

时间:2012-11-20 16:22:41

标签: c winapi

描述我的问题有点棘手,但我会尽我所能。

首先,我正在使用C和WinAPI开发一个多文档界面应用程序。我的程序能够解析命令行参数以打开多个文件。我把这个字符串: “X:\ MyAppName.exe”“%1” 在打开的txt文件的命令列表下,现在我可以右键单击Windows资源管理器中的任何.txt文件,并使用我的应用程序打开它。但是,当我选择多个文件时,资源管理器会多次运行命令“X:\ MyAppName.exe”“%1”,以便启动我的应用程序的多个实例。

但是等等! 这不是最棘手的部分。相反,我的应用程序将打开一个文件并一次打开多个文件作为具有单独视觉样式的两个不同的东西。我知道保持一个实例一次运行的想法(尽管我不是知道实现它的C代码)。但我不知道如何区分打开几个文件并同时打开多个文件。

我希望我说清楚。

1 个答案:

答案 0 :(得分:1)

使用您当前的注册表,您将无法直接区分单个文件中的多个文件。您已经注意到,每个请求的文件都会启动您应用的新副本。如果您实现单实例化(这不是那么难),您可以做的是检测何时请求第一个文件并启动一个短计时器,然后让每个后续文件重置该计时器。当它最终过去时,检查您收集的文件数量,并根据需要对其进行操作。

更好,更首选的解决方案是在应用程序中创建一个实现IDropTarget接口的进程外COM对象。然后,Windows将能够通过单个入口点将文件信息汇集到您的应用程序中。您的应用无需关心信息的来源。您不仅可以一次支持多个文件,甚至可以支持不同格式的文件信息(Windows可以只传递文件名,也可以传递实际的文件数据)。

Windows将构造一个IDataObject对象来保存所需的任何文件信息,然后将其传递给您的IDropTarget对象。如果您的应用已在运行,则COM将能够访问您现有的IDropTarget对象。如果您的应用尚未运行,COM将自动启动您的应用,然后再访问其IDropTarget对象。无论哪种方式,一旦它运行,你的IDropTarget可以查看传递给它的任何数据,并决定是接受它还是拒绝它。

如果您将COM对象的CLSID注册为DropTarget以获取所需的文件扩展名,则用户可以双击此类文件,或选择此类文件并按Enter键,它们将被传递到您的IDropTarget对象。

如果您为自己的应用注册AppPath,然后将CLSID注册为DropTarget,则用户可以将文件(无论扩展名)拖到您的应用上&# 39; s exe文件本身,它们将被传递给你的IDropTarget对象。

如果您使用具有RegisterDragDrop()功能的相同COM对象,用户将能够将文件(无论扩展名)直接拖到您应用的用户界面上,并将它们传递给您的{{ 1}}对象。