0

我正在创建一个包含多个 shell 扩展处理程序的项目。例如,有一个用于上下文菜单处理程序的类、一个用于属性系统处理程序的类、一个用于拖放处理程序的类等。

我不明白的部分是如何为包含多个处理程序的项目注册 CLSID。每个处理程序是否使用唯一的 CLSID 进行注册?因为每次在 Visual Studio 中为新处理程序创建类时,向导都会使用自己的 CLSID 设置它。或者有没有办法使用单个 CLSID 将它们全部集中到我的项目中?类型库是否会在其中发挥作用?

4

1 回答 1

1

每个处理程序类型通常有一个 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 或者需要额外的工作而没有什么好处。

于 2019-05-25T18:40:36.033 回答