2015-07-05 2 views
0

Я пытаюсь подключиться к диалогам файлов в моем проекте расширения имен. это делается в 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; 

это работает !!! благодаря!!

+0

Ваш C# код просто не эквивалентны, вы не можете пропустить работу что делает IUnknown_QueryService(). Что запрашивает IServiceProvider и вызывает его метод QueryService(). Мне непонятно, почему вы не вызываете это. –

+0

Я не уверен, как pInvoke его в C#. Вы можете помочь? – ArielB

+0

вещь, я не знаю, как обращаться с IID_PPV_ARGS – ArielB

ответ

1

Итак, благодаря 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 :)