【发布时间】:2010-01-11 01:14:30
【问题描述】:
我将制作一个将在后台运行的桌面应用程序,这意味着没有可见的窗口,并且我希望在用户右键单击文件时出现一个名为“上传文本”的选项。
有人能指出我正确的方向吗?我还必须确保,如果有人想在任何时候卸载程序,那么 shell 修改也被干净消除。
该应用程序将运行 Windows XP、Windows Vista 和 Windows 7。这些操作系统在处理我的 shell 困境方面有何不同?
【问题讨论】:
我将制作一个将在后台运行的桌面应用程序,这意味着没有可见的窗口,并且我希望在用户右键单击文件时出现一个名为“上传文本”的选项。
有人能指出我正确的方向吗?我还必须确保,如果有人想在任何时候卸载程序,那么 shell 修改也被干净消除。
该应用程序将运行 Windows XP、Windows Vista 和 Windows 7。这些操作系统在处理我的 shell 困境方面有何不同?
【问题讨论】:
这是一个外壳扩展。你已经用 C# 标签标记了这个问题;你应该知道writing shell extensions in a managed language is strongly discouraged:
不幸的是,非托管 C++ 确实是 去这里的唯一途径。
编写进程内 shell 扩展 在托管代码中实际上是一个非常 危险的事情,因为它有 注入托管的效果 代码(和 .NET 框架)到 机器上的每个应用程序 有一个文件打开对话框。
出现问题是因为只有一个 .NET Framework 的版本可以是 在任何给定时间加载到进程中 (其他共享组件如java 和 msxml 具有相同的属性和 因此同样的限制)。
如果你编写你的 shell 扩展 使用 2.0 .NET Framework 和 使用 1.1 .NET 构建的应用程序 框架使用文件打开对话框, 您的外壳扩展将失败,因为 它不能在早期版本上运行。 如果你的情况会变得更糟 shell-extension 设法加载 在另一个过程中 应用程序托管代码:您的 扩展可能会强制现有的 应用程序到不同的运行时 比预期的版本 并导致它失败。
由于这些问题,我们强烈 建议不要使用任何 每个进程一个实例运行时或 库(例如 .NET Framework, java 或 msxml)在进程内 shell 中 扩展名。
也就是说,人们已经做到了。
【讨论】:
您可以将您的应用添加到 SendTo 文件夹。
【讨论】:
使用 SendTo 的独立程序怎么样?
将 exe 安装到“Program Files\mycompany\myprogram”,并将 exe 的快捷方式安装到 SendTo 文件夹中。然后,当用户右键单击文件,选择 SendTo,然后选择您的程序时,您的 exe 将由 Windows 执行,并且文件名的完整路径将通过 argv[1] 传递。如果他们选择 n 个文件,他们将在 argv[1]..argv[n].
如果您希望您的程序不可见,则不要使默认表单可见。您可以选择在托盘中放置一个图标,以便用户可以双击它来查看上传进度。当 argv[1] 上传完成后,如果存在 argv[2]...argv[n] 则处理并退出。要彻底卸载,请从 SendTo 文件夹中删除您的程序和快捷方式。
【讨论】: