给定一个外壳扩展 CLSID,您如何找到实现 COM 可执行文件或 DLL,并检查其接口和成员?

Posted

技术标签:

【中文标题】给定一个外壳扩展 CLSID,您如何找到实现 COM 可执行文件或 DLL,并检查其接口和成员?【英文标题】:Given a shell-extension CLSID, how do you find the implementing COM executable or DLL, and inspect its interfaces and members? 【发布时间】:2021-10-24 21:17:38 【问题描述】:

我试图弄清楚文件资源管理器如何能够在特定程序(上下文菜单 => 打开方式)中打开文件,特别是已安装的 UWP (Appx) Microsoft 商店应用程序,以便我可以通过 Powershell 执行此操作。

更多详情请查看此帖: How to open installed Microsoft Store apps from powershell?

在该线程中,我们认为您可以使用以下参数启动已安装的 UWP 应用:

Start-Process ('shell:AppsFolder\' + (Get-AppXPackage *Edge*)[-1].PackageFamilyName + '!App') -ArgumentList 'http://example.org https://wikipedia.org'

但是,“照片”和“VLC”之类的应用似乎不只是打开作为参数传递的文件:

Start-Process ('shell:AppsFolder\' + (Get-AppXPackage *Photos*).PackageFamilyName + '!App') -ArgumentList 'C:\test\image1.png'
Start-Process ('shell:AppsFolder\' + (Get-AppXPackage *VLC*).PackageFamilyName + '!App') -ArgumentList 'C:\test\audio1.mp3'

上述线程中的@mklement0 认为它可能正在使用COM: \HKEY_CLASSES_ROOT\jpegfile\ShellEx\e357fccd-a995-4576-b01f-234630154e96%SystemRoot%\system32\PhotoMetadataHandler.dll

我对 powershell / COM / DLL 的经验很少,所以我不确定如何应用这些信息。

问题

是否有一种通用方法可以使用 Powershell(或 C# 作为最后手段)在指定的 UWP 应用中打开作为参数(或其他方式)传递的任何文件(任何扩展名)?

如果这很容易做到,您能否建议一种方法来获取支持指定文件类型/扩展名的应用程序列表? (与文件资源管理器的“打开方式”菜单相同)

【问题讨论】:

您找到的注册表项属于Thumbnail Handler。 docs 可能会有所帮助。至于用特定的 UWP 应用程序打开文件 - 我不知道。任务管理器的命令行一栏有没有什么帮助? 感谢您的信息。 UWP 应用的进程似乎没有在任务管理器中指定任何进程参数 【参考方案1】:

以下内容并未直接回答您的问题,但仍可能对您有所帮助:

如果您采用以文档为中心(以文件类型为中心)的视图:

您可以直接将文档(不可执行)传递给Start-Process,它默认使用Windows shell 的Open 动词来处理文档(与您在例如,文件资源管理器)。 -Verb 参数允许您选择不同的动词;例如,调用批处理文件 (*.cmd) 上的 Edit 动词,将其打开以进行编辑:

Start-Process -Verb Edit some.cmd

要确定给定文档(文件类型)的可用动词,请使用以下命令(注意,指定的文件不必存在 - 重要的是文件扩展名):

[System.Diagnostics.ProcessStartInfo] @ FileName = 'foo.cmd' 
注意: runasrunasuser 是标准动词,不是特定于文件类型的,指的是使用 elevation(作为管理员)和 作为不同的(非管理员)执行操作用户Open 并不总是明确列出,但它隐含可用 - 在文件类型没有的情况下,关联的应用程序会显示一个对话框以供选择或下载来自 Microsoft Store 的一个(对话框没有用于 dismissing(关闭)它的 GUI 元素,但您可以简单地按 Esc)。

【讨论】:

感谢您的信息。打印动词似乎很有用,我可能会使用它。但我认为无论如何我都必须为这些本机操作编写本机 .NET / C# / C++ 模块或可执行文件。我还需要一种方法来触发本机 Win 10 共享对话框,这也需要一些本机调用,我认为没有办法绕过它,看来 Powershell 不是这种操作的工具

以上是关于给定一个外壳扩展 CLSID,您如何找到实现 COM 可执行文件或 DLL,并检查其接口和成员?的主要内容,如果未能解决你的问题,请参考以下文章

给定一个OCX文件,如何知道它的CLSID

给定一个 COM DLL,提取所有类 CLSID 和相应的接口名称

如何查看ocx控件的clsid

如何知道 OPC Server CLSID?

Packetbeat协议扩展开发教程 一

如何使SWT窗口/外壳及其上的所有组件可调节?