如何从IUnknown_QueryService SID_SExplorerBrowserFrame中检索C#中的IFi

本文关键字:检索 IFi 中的 SExplorerBrowserFrame SID IUnknown QueryService | 更新日期: 2023-09-27 18:01:03

我正试图挂接到我的自定义命名空间扩展项目中的文件对话框中。这是在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接口:这是在设置站点方法下完成的:

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;

成功了!!!谢谢

如何从IUnknown_QueryService SID_SExplorerBrowserFrame中检索C#中的IFi

所以,多亏了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:(