IOleWindow не работает должным образом для IFileDialog?

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

The calling process can use the window handle of the dialog itself as the parent of the UI. That handle can be obtained by first calling IOleWindow::QueryInterface and then calling IOleWindow::GetWindow with the handle as shown in this example.

(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 (в последнее время я не так много работал с COM-взаимодействием, но это завершает вызов QueryInterface в базовом мире COM, верно?), Ошибки не возникает, и ссылка IOleWindow не null. Но когда я звоню GetWindow, кажется, что всегда возвращается IntPtr.Zero. Я попытался объявить метод с параметром out вместо возвращаемого значения и получил тот же результат: без ошибок, но всегда IntPtr.Zero.

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

Подходящим объявлением IOleWindow является доступно здесь. Получение методов в неправильном порядке довольно фатально.

Hans Passant 21.11.2018 00:23

Большое спасибо! Пробую прямо сейчас.

Jonathan Gilbert 21.11.2018 00:25

Как я уверен, вы уже знали, что именно в этом и заключалась проблема. Если вы чувствуете, что хотите отправить ответ, даже если «Порядок методов в COM-интерфейсе важен, а порядок в вашем объявлении IOleWindow неправильный», я буду счастлив отметить это как ответ. :-)

Jonathan Gilbert 21.11.2018 01:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме