IsWindow (activeX.GetSafeHwnd ()) всегда ложно после обновления до VS2010 - PullRequest
0 голосов
/ 31 октября 2011

У меня есть приложение MFC, в котором используется древний (около 1999 г.) сторонний элемент управления ActiveX.

После обновления проекта с VS2008 до VS2010 у меня возникли проблемы ...

В обработчике OnSize родительского диалога IsWindow всегда возвращает false для дескриптора, возвращенного control.GetSafeHwnd (), даже когда GetSafeHwnd () возвращает ненулевое значение.Остальная часть родительского диалогового окна элемента управления отображается нормально, но, похоже, он не реагирует ни на какие входные данные.

Я видел эту статью , но GetSafeHwnd () не возвращаетсяNULL в этом случае (после первого вызова, то есть до того, как будет создан экземпляр элемента управления).

Элемент управления вызывает вывод сообщения трассировки "Control хочет быть без окна" при загрузке.Однако он также делает это при компиляции в VS2008, так что это может быть красная сельдь.Поиск этого сообщения указывает на то, что я создал класс, производный от COleControlSite, и запретил элемент управления без окон, но, похоже, нет хорошего примера этого, и, как я уже сказал, не ясно, что это действительно является причинойпроблема.

Я также обнаружил эту проблему, упомянутую на Странице переноса MSDN VS2010 :

"Элемент управления ActiveX, скомпилированный с использованием Visual C ++ 6.0, при внедрениив диалоговом окне в проекте, разработанном с использованием Visual C ++ 2010, может привести к утверждению вашей программы во время выполнения. В этой ситуации откройте проект ATL или MFC, связанный с элементом управления ActiveX в Visual C ++ 2010, и перекомпилируйте его.assert будет в файле occcont.cpp, в этой строке в источнике: ASSERT (IsWindow (pTemp-> m_hWnd)). "

Я предполагаю, что в элементах ActiveX, скомпилированных с VS6, есть что-то, что вызываетдескрипторы окна должны рассматриваться как недействительные текущей реализацией Win32 IsWindow.Предлагаемое решение, конечно, бесполезно, так как это сторонний элемент управления, и мы не можем перекомпилировать его.

Кому-нибудь удалось обойти это?

Я уже нашел решения для проектов VS2010, не работающих в Windows 2000, и ошибки, связанные с ODBC, но, похоже, не в состояниинайди что-нибудь на этом.

Спасибо,

Крис

Ответы [ 2 ]

0 голосов
/ 15 октября 2016

Для чего это стоит: если вам все равно, будет ли элемент управления прозрачным или нет, вы можете в любом случае заставить элемент управления иметь окно - даже если он может работать без окна.

Видите ли, элемент управления ActiveX должен сначала спросить контейнер (окно, в котором будет размещен элемент управления), можно ли активировать его без окна. Это просто потому, что не все контейнеры поддерживают активацию без окон.

Если с этим интерфейсом (IOleInPlaceSiteWindowless) все в порядке, то он продолжает эту специальную активацию без окон, если не будет создано окно для элемента управления как обычно.

Отказ от ответственности: Я не знаю, заставит ли это «ненужное» окно пропустить утверждение. Другими словами: я не знаю, достаточно ли глубоко описан дескриптор окна в элемент управления AX.

Подробнее об интерфейсе IOleInPlaceSiteWindowless: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682300(v=vs.85).aspx

0 голосов
/ 22 декабря 2011

В итоге я не нашел решения этой проблемы - обновил элементы управления до версии, совместимой с VS2010.

...