如何从 IUnknown_QueryService SID_SExplorerBrowserFrame 检索 C# 中的 IFileOpenDialog 接口?
How to retrieve IFileOpenDialog interface in C# from IUnknown_QueryService SID_SExplorerBrowserFrame?
我正在尝试连接到我的自定义命名空间扩展项目中的文件对话框。
这是在 C# 中完成的。
在 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;
这有效!!!谢谢!!
所以,感谢 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 :)
我正在尝试连接到我的自定义命名空间扩展项目中的文件对话框。 这是在 C# 中完成的。
在 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;
这有效!!!谢谢!!
所以,感谢 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 :)