2009-06-19 8 views
6

Mam starą aplikację VB6, która używa formantu ImageList z COMCTL32.OCX ("Microsoft Windows Common Controls 5.0 (SP2)"), aby zapewnić ikony dla widoków drzewa i widoków list. .Używanie ImageList z aplikacji VB6 powoduje awarię w systemie Windows 7.0 64-bitowy

Aplikacja nie uruchomi się nawet w 64-bitowym systemie Windows 7.0. W chwili, gdy próbuje załadować formularz, na którym znajduje się ImageList, ulega awarii (no, właściwie, aplikacja mruga, wychodząc bez śladu).

Usunięcie elementu ImageList z formularza rozwiązuje problem.

Wszelkie pomysły?

+1

Nie mam pojęcia, z wyjątkiem zgłoszenia go firmie Microsoft. Po drugie, może trochę zawęzić, udowadniając, że pojedynczy obraz działa. –

Odpowiedz

8

I rozwiązany ten problem poprzez zastąpienie wszystkich wystąpień COMCTL32.OCX, który przyszedł z VB5, z MSCOMCTL.OCX, który przyszedł z VB6.

Artykuł Microsoft KB nr 190952 zawiera instrukcje dotyczące wykonywania tej czynności. To była tylko operacja globalnego wyszukiwania i zastępowania.

1

Możliwe, że napotkasz problem z funkcją Data Execution Protection (DEP). Przetestuj go, wyłączając funkcję DEP:

bcdedit.exe /set {current} nx AlwaysOff 

Uruchom ponownie po wprowadzeniu powyższego w linii poleceń. Pamiętaj o ponownym włączeniu, ponieważ jest to odpowiednik działania systemu Windows z opuszczonymi spodniami.

Edytuj: Powyższe polecenie działa w systemie Vista. Nie próbowałem go na Windows 7.

+0

+1 Tak, brzmi jak klasyczny DEP, zdecydowanie pierwszy port zawinięcia. – AnthonyWJones

1

Mniej drastyczne poprawki DEP można przejść do okna dialogowego wydajności komputerów (karta Zaawansowane właściwości systemu) i dodać aplikacje do listy wyjątków na karcie DEP.

BTW, jesteś pewien, że to nie należy do serverfault.com. : P

2

Zgłoś błąd do firmy Microsoft. Runtime VB6 jest still supported na 64-bitowym systemie Windows 7. Comctl32.ocx nie jest zainstalowany w systemie Windows 7, ale jest explicitly listed jako obsługiwane w systemie Windows 7.

2

Twoje rozwiązanie jest OK. Ale COMCTL32.OCX powinien mimo wszystko działać poprawnie na Win64 (Vista lub 7).

Tylko trochę rada:

przypadku korzystania MSCOMCTL.OCX nie będzie w stanie zastosować do ListView lub TreeView styl XP/Vista/7 i Twoja aplikacja może wyglądać obco. Manifest nie będzie miał żadnego wpływu na elementy sterujące MSCOMCTL.OCX.

Obejście problemu polegałoby na podklasie elementów sterujących MSCOMCTL.OCX, a ponieważ nadal zawierają one nagłówek COMCTL32.DLL, można manipulować sposobem malowania.

(Opublikowałbym jako komentarz, ale nadal nie mogę)

Powiązane problemy