IOleWindow не работает должным образом для IFileDialog? - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю с некоторым кодом, который использует Microsoft.WindowsAPICodePack для предоставления оболочки C # для общих диалогов в стиле Vista (IFileOpenDialog, IFileSaveDialog).Я хочу добавить проверку выбранного элемента в обратном вызове события OnFileOk, и это в основном работает, но один из аспектов этого заключается в извлечении HWND диалога для использования в качестве родителя для отображаемого окна сообщения,Microsoft предоставляет документацию о том, как это сделать:

Вызывающий процесс может использовать дескриптор окна самого диалога в качестве родителя пользовательского интерфейса.Этот дескриптор можно получить, сначала вызвав IOleWindow :: QueryInterface , а затем вызвав IOleWindow :: GetWindow с дескриптором, как показано в этом примере.

(https://msdn.microsoft.com/en-us/library/windows/desktop/bb776913(v=vs.85).aspx)

Я добавил определение кода IOleWindow к коду:

[ComImport,
Guid(ShellIIDGuid.IOleWindow),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IOleWindow
{
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
    void ContextSensitiveHelp(
        [In] bool fEnterMode);

    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
    IntPtr GetWindow();
}

...

    internal const string IOleWindow = "00000114-0000-0000-C000-000000000046";

Когда я приводил IFileDialog, переданный в OnFileOk в IOleWindow (Iв последнее время не так много работали с COM-взаимодействием, но это оборачивает вызов QueryInterface в базовом мире COM, верно?), ошибки не возникает, и ссылка IOleWindow не является null. Но когда явызов GetWindow, кажется, он всегда возвращает IntPtr.Zero. Я попытался объявить метод с параметром out вместо возвращаемого значения и получить тот же результат: без ошибок, но всегда IntPtr.Zero.

Кто-нибудь видит, что я делаю неправильно? Я не делаю ничего плохого, но просто иногда вы не можете получить дескриптор окна ??

1 Ответ

0 голосов
/ 07 января 2019

@ Ответ Ханса Пассанта был на носу.Порядок методов в COM-интерфейсе важен, и у меня был неправильный порядок, все просто.Я получил заказ из документации, которая была отсортирована в алфавитном порядке, а не из фактического IDL.: -P

Неправильный порядок, только для человеческих глаз:

Правильный порядок, фактический IDL:

(я не знаю, кто такой @tpn на GitHub, эта ссылка может разорваться, но если это произойдет, просто посмотрите IOleWindow в файле OleIdl.idlиз Windows SDK. :-))

...