如何从IUnknown_QueryService SID_SExplorerBrowserFrame中检索C#中的IFileOpenDialog接口?

时间:2015-07-05 15:35:46

标签: 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接口: 这是在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"进入所需的界面。

任何帮助都会得到满足。

**从评论**,

更新

我试过这样做:

[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;
这工作有效!!!谢谢!

1 个答案:

答案 0 :(得分:2)

所以,感谢Hans Passant,我明白“IUnknown_QueryService”和我尝试的不一样。

我设法通过以下方式捕获界面:

[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:)