如何从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;
成功了!!!谢谢
所以,多亏了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:(