C# 调用windows资源管理器外壳扩展

C# 调用windows资源管理器外壳扩展,c#,windows,delphi,shell-extensions,C#,Windows,Delphi,Shell Extensions,是否有任何方法可以通过编程方式调用作为shell扩展的DLL?我们使用一个在windows资源管理器上注册外壳扩展的软件,我需要调用其上下文菜单上的一个可用项。我没有要调用的软件源代码 编辑 仅当我在windows资源管理器上选择PDF文件时,此关联菜单才会显示。所以我需要调用它来传递一个dll文件 编辑 注册资料: [HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}] @=“PDFTTransformer3.PDFTCo

是否有任何方法可以通过编程方式调用作为shell扩展的DLL?我们使用一个在windows资源管理器上注册外壳扩展的软件,我需要调用其上下文菜单上的一个可用项。我没有要调用的软件源代码

编辑

仅当我在windows资源管理器上选择PDF文件时,此关联菜单才会显示。所以我需要调用它来传递一个dll文件

编辑

注册资料:

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}] @=“PDFTTransformer3.PDFTContextMenu.1”

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\InprocServer32] @=“C:\Program Files\ABBYY PDF Transformer 3.0\PDFTContextMenu.dll” “ThreadingModel”=“单元”

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\ProgID] @=“PDFTTransformer3.PDFTContextMenu.1”

[HKEY_CLASSES_ROOT\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\可编程]

[HKEY\U CLASSES\CLSID{2DC8E5F2-C89C-4730-82C9-19120DEE5B0A}\VersionIndependentProgID] @=“PDFTTransformer3.PDFTContextMenu”

编辑

是否可以使用我想要的动词(不是默认动词)调用
ShellExecuteEx
?如果是这样,我如何调用我想要的动词(使用DLL)

这就是我想要PDF文件的动词:


这是一个COM对象。您只需要创建它,并向它传递接口(后面有足够的实现)使它工作

Explorer(即您)将要求shell扩展向其他浏览器添加项目。然后浏览器(即您)调用一个菜单项来响应用户

幸运的是,shell中的所有内容都是一个接口,因此您可以假装自己想要什么。你只需要这样

记住:。很多人不是。在CommCtrl的“另存为”对话框中托管了大量数据


就你而言

  • 创建COM对象
  • 查询其
    IShellExtInit
    接口,并调用
    .Initialize
  • 查询其
    IContextMenu
    界面
  • 调用
    IContextMenu.QueryContextMenu
    ,允许它将项目添加到
    humenu
  • 调用IContextMenu.Invoke
再次,从另一方阅读合同的案例


一些伪代码:

var
   ClassID: TGUID;
   unk: IUnknown;
   shellext: IShellExtInit;
   dataObject: IDataObject;
   hkeyProgID: HKEY;
   contextMenu: IContextMenu;
   commandInfo: CMINVOKECOMMANDINFO;
begin
   ClassID := ProgIDToClassID('PDFTransformer3.PDFTContextMenu'); 
   unk := CreateComObject(ClassID);

   shellExt := unk as IShellExtInit;

    {
       For shortcut menu extensions, 
          pdtobj identifies the selected file objects,
          hkeyProgID identifies the file type of the object with focus, and 
          pidlFolder is either NULL (for file objects) or specifies the folder 
             for which the shortcut menu is being requested 
             (for folder background shortcut menus).
   }
   shellExt.Initialize(
         nil, //pidlFolder, null for file objects
         dataObject, //IDataObject of the selected file
         hkeyProgID); //HKEY of the file type of the object with focus    

   contextMenu := unk as IContextMenu;
   contextMenu.QueryContextMenu(
         menuHandle, //HMENU, A handle to the shortcut menu. The handler should specify this handle when adding menu items.
         0, //integer, The zero-based position at which to insert the first new menu item.
         100, //The minimum value that the handler can specify for a menu item identifier.
         200, //The maximum value that the handler can specify for a menu item identifier.
         CMF_NORMAL); //optional flags

   contextMenu.InvokeCommand(commandInfo);
这是我从阅读文档和猜测该做什么中得到的。现在我必须小便,然后回家玩门户2,拉斐尔,你可以使用这个界面。从这里,您可以枚举接口返回的条目,然后使用

执行所需的选项。DLL显然是一个。如果希望以与shell相同的方式调用它,则希望宿主DLL实现的IContextMenu接口。几年前,陈雷蒙(Raymond Chen)就这个话题写了一系列内容广泛的文章:

如何托管IContextMenu

  • 前两篇文章是最重要的。它们首先介绍如何获取文件的IContextMenu接口,然后介绍如何调用该菜单提供的一个或多个命令。本质上,填充CMInvokeCommandInfo结构,然后将其传递给接口的方法。文章调用向用户显示菜单,然后使用选择填充结构,但如果您已经确切知道要运行哪个命令,则可以放弃显示菜单。(不过,您可能仍然需要创建菜单,因为IContextMenu对象可能希望首先调用它。)

    shell扩展做什么?它是什么类型的扩展名?它在pdf文件中工作。我猜它是一个COM DLL,但我不确定。你需要知道它是什么类型的外壳扩展,才能知道如何调用它。如果您不知道它是什么类型的,那么您如何知道需要哪些COM接口呢?在确定它是什么类型的shell扩展之前,您不会得到答案。有很多不同类型的shell扩展。顺便说一句,+1是为了补偿那些在没有留下任何评论的情况下投了反对票的人。我想我不知道该怎么做。也许有人能教我如何用ShellExecuteEx来调用这个动词。但谢谢你的帮助。听起来不错,但我对c#是新手。你能给我一个示例或德尔福代码吗?请检查这个问题和克雷格·彼得森的答案。@RRUZ@Rafael,首先我不在这个链接中发布任何代码,只提供建议,发布的代码来自克雷格·彼得森。此代码可以指导您解决问题,如果您的问题没有按预期工作,您可以在S.O中发布一个新问题,其中包含帮助您的代码,显示不适合您的部分
    。@RRUZ,抱歉。我是指你发布的链接上的来源。为什么他不能直接打电话给ShellExecuteEx?不知道,@David。他问如何调用DLL,但我想根据经验你知道,回答问题会给我们带来麻烦。但是,即使他确实使用了ShellExecuteEx,他仍然需要通过一次这个过程来找出哪些动词是可用的,因为它们不在注册表中。如果有人告诉我如何使用ShellExecuteEx调用上下文菜单,这没关系。我正在研究你发布的链接,但我还没有工作。