c# - 如何从 IUnknown_QueryService SID_SExplorerBrowserFrame 检索 C# 中的 IFileOpenDialog 接口(interface)?

标签 c# .net invoke shell-extensions

我正在尝试连接到我的自定义命名空间扩展项目中的文件对话框。 这是用 C# 完成的。

我正在尝试关注该帖子: http://blogs.msdn.com/b/winsdk/archive/2015/03/24/how-to-register-for-file-dialog-notifications-from-shell-namespace-extension.aspx

在 C++ 中一切正常,我得到了 IFileOpenDialog 接口(interface): 这是在 SetSite 方法下完成的:

HRESULT hr = IUnknown_QueryService(m_pUnkSite, SID_SExplorerBrowserFrame, IID_PPV_ARGS(&m_fileOpenDialog));

其中 m_fileOpenDialog 是 IFileOpenDialog

我试图在 C# 中做同样的事情,但它不起作用......

我尝试了几种方法:

FileDialogNative.IFileOpenDialog o2 = Marshal.GetObjectForIUnknown(m_pUnkSite) as FileDialogNative.IFileOpenDialog;

o2 为空。

我已经尝试过

IntPtr ptr;
Guid g = new Guid("000214f1-0000-0000-c000-000000000046");
int rc = Marshal.QueryInterface(m_pUnkSite, ref g, out ptr);

这成功了,但我不知道如何将“ptr”转换为所需的接口(interface)。

如有任何帮助,我们将不胜感激。

**根据评论更新**,

我尝试这样做:

[DllImport("shlwapi.dll")]
internal static extern int IUnknown_QueryService(IntPtr pUnk, ref Guid guidService, ref Guid riid, out IntPtr ppvOut);


Guid g = new Guid("000214F1-0000-0000-C000-000000000046"); // SID_SExplorerBrowserFrame
Guid g2 = new Guid("d57c7288-d4ad-4768-be02-9d969532d960"); // IFileOpenDialog

IntPtr pp;
int rrc =  Win32.IUnknown_QueryService(pUnkSite, ref g, ref g2, out pp);

FileDialogNative.IFileOpenDialog o2 = Marshal.GetObjectForIUnknown(pp) as FileDialogNative.IFileOpenDialog;

这有效!谢谢!!

最佳答案

感谢 Hans Passant,我了解到“IUnknown_QueryService”与我尝试过的不一样。

我已经设法通过以下方式捕获接口(interface):

[DllImport("shlwapi.dll")]
internal static extern int IUnknown_QueryService(IntPtr pUnk, ref Guid guidService, ref Guid riid, out IntPtr ppvOut);


Guid g = new Guid("000214F1-0000-0000-C000-000000000046"); // SID_SExplorerBrowserFrame
Guid g2 = new Guid("d57c7288-d4ad-4768-be02-9d969532d960"); // IFileOpenDialog

IntPtr pp;
int rrc =  Win32.IUnknown_QueryService(pUnkSite, ref g, ref g2, out pp);

FileDialogNative.IFileOpenDialog dlg = Marshal.GetObjectForIUnknown(pp) as FileDialogNative.IFileOpenDialog;
Marshal.Release(pp);

然后,我就可以使用 dlg :)

关于c# - 如何从 IUnknown_QueryService SID_SExplorerBrowserFrame 检索 C# 中的 IFileOpenDialog 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232000/

相关文章:

c# - Google 不允许网络客户端吗?

VB.net ApplicationFramework 加上 SplashScreen : InvalidOperationException

C# 多线程

c# - 跟踪为类和子类创建的实例总数

c# - 如何在 C# 中打开 Excel 文件?

c# - 将由特定于文化的数字组成的 Unicode 字符串转换为整数值

java - 从jsp文件中调用java函数

android - Gradle 错误 Cannot invoke method dependencies() on null object

c# - 如何在 ObjectListView 中正确选择一行?

c# - 加载 WPF 组合框的数据集