Использование ImageList из приложения VB6 вызывает сбой в 64-разрядной версии Windows 7.0

У меня есть старое приложение VB6, которое использует элемент управления ImageList из COMCTL32.OCX ("Microsoft Windows Common Controls 5.0 (SP2)") для предоставления значков для TreeViews и ListViews.

Приложение даже не запускается на Windows 7.0 64 бит. В ту минуту, когда он пытается загрузить форму, содержащую ImageList, он падает (ну, на самом деле, приложение закрывается, закрываясь без следа).

Удаление ImageList из формы решает проблему.

Любые идеи?


person Joel Spolsky    schedule 19.06.2009    source источник
comment
Без понятия, кроме как сообщить об этом в Microsoft. Во-вторых, возможно, немного сузить круг, доказав, что одно изображение работает.   -  person John Saunders    schedule 19.06.2009


Ответы (5)


Я решил эту проблему, заменив все экземпляры COMCTL32.OCX, которые поставлялись с VB5, на MSCOMCTL.OCX, которые поставлялись с VB6.

В статье Microsoft KB 190952 есть инструкции по этому поводу. Это была просто глобальная операция поиска и замены.

person Joel Spolsky    schedule 19.06.2009

Сообщите об ошибке в Microsoft. Среда выполнения VB6 по-прежнему поддерживается в 64-разрядной версии Windows 7. COMCTL32 .ocx не устанавливается вместе с Windows 7, но явно указан как поддерживается в Windows 7.

person MarkJ    schedule 19.06.2009

Ваше решение в порядке. Но COMCTL32.OCX в любом случае должен нормально работать на Win64 (Vista или 7).

Просто небольшой совет:

Если вы используете MSCOMCTL.OCX, вы не сможете применить к своему списку или дереву стиль XP/Vista/7, и ваше приложение может выглядеть чуждым. Манифест не повлияет на элементы управления MSCOMCTL.OCX.

Обходным путем может быть подкласс элементов управления MSCOMCTL.OCX, и, поскольку они все еще содержат заголовок COMCTL32.DLL, вы можете управлять его отрисовкой.

(Я бы написал как комментарий, но я все еще не могу)

person user97863    schedule 21.02.2010

Возможно, вы столкнулись с проблемой защиты от выполнения данных (DEP). Проверьте это, отключив DEP:

bcdedit.exe /set {current} nx AlwaysOff

Перезагрузитесь после ввода вышеуказанного в командной строке. Не забудьте включить его снова, так как это эквивалентно запуску Windows со спущенными штанами.

Изменить: приведенная выше команда работает в Vista. На Windows 7 не пробовал.

person C-Pound Guru    schedule 19.06.2009
comment
+1 Да, звучит как классический DEP, определенно первый порт захода. - person AnthonyWJones; 19.06.2009

Менее радикальная настройка DEP — перейти в диалоговое окно производительности компьютеров (расширенная вкладка свойств системы) и добавить исполняемый файл приложения в список исключений на вкладке DEP.

Кстати, вы уверены, что это не относится к serverfault.com? :П

person AnthonyWJones    schedule 19.06.2009