System.AccessViolationException treedt op met de weergave van knopinfo in Windows Forms-toepassing

Symptomen

U hebt een Microsoft .NET Windows Forms-toepassing die gebruikmaakt van een ToolTip-besturingselement ontwikkeld. Knopinfo wordt weergegeven, verschijnt een System.AccessViolationException als de toepassing te beëindigen.

Oorzaak

Dit gebeurt wanneer de toepassing van versie 5.0 van de algemene besturingselementen van Windows in comctl32.dll gebruikmaakt. Het probleem treedt op vanwege een opnieuw entrancy/timing-probleem dat uitgevoerd wordt wanneer de toepassing wordt geprobeerd om de ToolTip-besturingselement weer te geven, maar vervolgens duurt een codepad die heeft geprobeerd om het te verbergen voordat deze werd in eerste instantie weergegeven. Dit is een bug in versie 5.0 van de algemene besturingselementen van Windows (comctl32.dll) die door het besturingssysteem.

Oplossing

Dit probleem is gecorrigeerd in versie 6.0 van comctl32.dll. Het probleem in een Windows Forms-toepassing kunt u oplossen door de toepassing in versie 6.0 van comctl32.dll niet wijzigen. Toepassingen moeten Application.EnableVisualStylesaanroepen om een opt-in versie 6.0 van comctl32.dll, Windows Forms.

Zie de volgende MSDN-documentatie voor meer informatie over de methode Application.EnableVisualStyles.

Application.EnableVisualStyles, methode

Meer informatie

Wanneer de knopinfo wordt gemaakt, slaat comctl32.dll interne statusinformatie die later worden gebruikt. Wanneer de schakelopties voor de gebruiker naar een andere toepassing, de toepassing nog steeds is code die in behandeling zijn die worden gebruikt om de knopinfo weer te geven. Wanneer de toepassing wordt gedetecteerd dat wordt gedeactiveerd, verwerkt comctl32.dll dit door vernietiging van de interne status-informatie voor de knopinfo. Nadat dit is voltooid, wordt de call-stack afgewikkeld terug naar de oorspronkelijke code die is een poging om de knopinfo weer te geven. De informatie over de status wordt geopend zonder controle op null, wat tot een toegangsfout leidt.

Het callstack ontlast wordt als volgt uitzien als u fouten opspoort.

System.AccessViolationException: Er is geprobeerd te lezen of schrijven beschermd geheugen. Dit is vaak een indicatie dat andere geheugen beschadigd is.
op System.Windows.Forms.UnsafeNativeMethods.CallWindowProc (IntPtr, IntPtr, Int32, IntPtr, IntPtr)
op System.Windows.Forms.NativeWindow.DefWndProc (System.Windows.Forms.Message ByRef)
op System.Windows.Forms.ToolTip.WndProc (System.Windows.Forms.Message ByRef)
op System.Windows.Forms.ToolTip+ToolTipNativeWindow.WndProc (System.Windows.Forms.Message ByRef)
op System.Windows.Forms.NativeWindow.Callback (IntPtr, Int32, IntPtr, IntPtr)


Als u foutopsporing dit onder een native debugger, zoals Windbg, ziet u de volgende toegangsfout en callstack.

0:000 > r
eax=00000000 ebx=77392673 ecx=0012e59c edx=7c82845c esi=05d3cb80 edi=fffffdf7 
EIP = 775744b3 esp ebp 0012e5c0 = 0012e604 iopl = 0 = nv van ei pl nz ac IO nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010212 
comctl32!DoShowBubble+0xc2: 
775744b3 8b480c mov ecx, dword ptr [eax + 0Ch] ds:0023:0000000 c =???
 
0:000 > knL
# ChildEBP RetAddr
00 0012e604 775746d 8 comctl32! DoShowBubble + 0xc2
01 0012e618 77543d 63 comctl32! ShowBubbleForTool + 0x32
02 0012e62c 775358c 3 comctl32! TTHandleTimer + 0x8b
03 0012e74c 7739b6e3 comctl32! ToolTipsWndProc + 0x311
04 0012e778 7739b874 user32! InternalCallWinProc + 0x28
05 0012e7f0 7739bfce0 user32! UserCallWinProcCheckWow + 0x151
06 0012e820 7739bf74 user32! CallWindowProcAorW + 0x98
07-0012e840 7b56a9ad user32! CallWindowProcW + 0x1b
08-0012e898 7b52b79d System_Windows_Forms_ni! System.Windows.Forms.NativeWindow.DefWndProc (System.Windows.Forms.Message ByRef) + 0x6d
09-0012e97c 7b52b70e System_Windows_Forms_ni! System.Windows.Forms.ToolTip.WndProc (System.Windows.Forms.Message ByRef) + 0x81
0a 0012e9d4 7b56a256 System_Windows_Forms_ni!System.Windows.Forms.ToolTip+ToolTipNativeWindow.WndProc(System.Windows.Forms.Message ByRef)+0x12 
0b 0012e9d4 010e20bd System_Windows_Forms_ni! System.Windows.Forms.NativeWindow.Callback (IntPtr, Int32, IntPtr, IntPtr) + 0x96


Nieuwe Windows Forms-toepassingen standaard moeten automatisch Application.EnableVisualStyles aanroepen. In C# projecten, wordt aanroepen van deze methode toegevoegd aan het ingangspunt van de toepassing in void Main() binnen Program.cs. In Visual Basic.NET-projecten met deze methode wordt automatisch aangeroepen als de ' Application Framework inschakelen' en 'XP visuele stijlen inschakelen' opties zijn geselecteerd in het venster van de eigenschappen van het project.

Meer hulp nodig?

Uw vaardigheden uitbreiden
Training verkennen
Als eerste nieuwe functies krijgen
Deelnemen aan Microsoft insiders

Was deze informatie nuttig?

Bedankt voor uw feedback.

Hartelijk dank voor uw feedback! Het lijkt ons een goed idee om u in contact te brengen met een van onze Office-ondersteuningsagenten.

×