我正在创建一个包含多个 shell 扩展处理程序的项目。例如,有一个用于上下文菜单处理程序的类、一个用于属性系统处理程序的类、一个用于拖放处理程序的类等。
我不明白的部分是如何为包含多个处理程序的项目注册 CLSID。每个处理程序是否使用唯一的 CLSID 进行注册?因为每次在 Visual Studio 中为新处理程序创建类时,向导都会使用自己的 CLSID 设置它。或者有没有办法使用单个 CLSID 将它们全部集中到我的项目中?类型库是否会在其中发挥作用?
我正在创建一个包含多个 shell 扩展处理程序的项目。例如,有一个用于上下文菜单处理程序的类、一个用于属性系统处理程序的类、一个用于拖放处理程序的类等。
我不明白的部分是如何为包含多个处理程序的项目注册 CLSID。每个处理程序是否使用唯一的 CLSID 进行注册?因为每次在 Visual Studio 中为新处理程序创建类时,向导都会使用自己的 CLSID 设置它。或者有没有办法使用单个 CLSID 将它们全部集中到我的项目中?类型库是否会在其中发挥作用?
每个处理程序类型通常有一个 CLSID,但也可能只有一个 CLSID。
如果您可以拥有一个 CLSID 取决于您是否可以检测到您是哪个处理程序,这仅基于您被QueryInterface
教育的目的以及如何/如果IShellExtInit::Initialize
被调用等。
如果您考虑 COM 的工作原理,shell 将调用CoCreateInstance(YourCLSID, ..., ISomething)
并且您的 .DLL 将创建 YourCLSID 工厂,COM 将要求该工厂创建 ISomething 的实例。
例如,如果您的 C++ 代码如下所示:
class AllMyHandlers : public IShellExtInit, public IInitializeCommand { ...
那么你知道如果IInitializeCommand::Initialize
被调用那么你可能是一个IExecuteCommand
处理程序。如果IShellExtInit::Initialize
被调用,您可以查看参数以确定您的处理程序类型(但并非每种组合都可以检测到)。
这是一个非常依赖于知道 shell 要求哪些接口的 hack,并且它在理论上可能会在未来发生变化。
另一种方法是支持所有内容(我的意思是,存储来自所有 Initialize 方法的所有有用的传入数据)并且仅在调用 Drag/Add/Execute 方法之一并且您确定自己是哪种类型时才确定类型.
我建议您为每种类型使用一个 CLSID,其他任何东西都有点 hacky 或者需要额外的工作而没有什么好处。