Я пытаюсь подключиться к диалогам файлов в моем проекте расширения имен. это делается в C#.Как получить интерфейс IFileOpenDialog в C# из IUnknown_QueryService SID_SExplorerBrowserFrame?
я пытаюсь следовать пост: 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 - null.
Я попытался
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;
это работает !!! благодаря!!
Ваш C# код просто не эквивалентны, вы не можете пропустить работу что делает IUnknown_QueryService(). Что запрашивает IServiceProvider и вызывает его метод QueryService(). Мне непонятно, почему вы не вызываете это. –
Я не уверен, как pInvoke его в C#. Вы можете помочь? – ArielB
вещь, я не знаю, как обращаться с IID_PPV_ARGS – ArielB