Ist ChooseFont() buggy?
-
Folgendes Problem:
#include <Windows.h> int main() { static LOGFONT lf = { 0 }; CHOOSEFONT cf = { 0 }; cf.lStructSize = sizeof(cf); cf.hwndOwner = NULL; cf.lpLogFont = &lf; cf.Flags = CF_SCREENFONTS | CF_EFFECTS; ChooseFont(&cf); return 0; }
Starte ich das Ganze funktioniert das Programm tadellos. Starte ich aber den Application Verifier und überprüfe das Programm auf Heap Fehler, so stürzt das Programm gnadenlos mit einer Access Violation in fms.dll ab.
Hintergrund war, dass der Font-Auswahl Dialog auf manchen Rechnern einfach abstürzte und auf anderen Rechnern nicht. Also habe ich den Application Verifier eingeschaltet und bin auf den hier beschriebenen Fehler gestoßen.
-
Du machst keine gültige Vorgabe, also denke ich, dass auch diese Flags gesetzt werden müssen
CF_NOFACESEL|CF_NOSIZESEL|CF_NOSTYLESEL
-
Hmm, leider zeigt sich auch bei veränderten Flags keine Änderung. Das Programm stürzt immer noch mit einer Access Violation ab.
Was ich aber absolut nicht verstehe ist, dass der Application Verifier mir auch keine Fehler anzeigt.
-
Sicherheitshalber noch InitCommonControls.
-
Es ist leider zum Mäuse melken.
Leider stürzt das Programm immer noch bei aktivem Heap Test des Application Verifiers ab.
#ifndef WINVER // Minimum platform is Windows 7 #define WINVER 0x0601 #endif #ifndef _WIN32_WINNT // Minimum platform is Windows 7 #define _WIN32_WINNT 0x0601 #endif #ifndef _WIN32_WINDOWS // Minimum platform is Windows 7 #define _WIN32_WINDOWS 0x0601 #endif #include <Windows.h> #include <ObjBase.h> #include <Commctrl.h> #pragma comment(lib, "Comctl32.lib") int main() { CHOOSEFONT cf = { 0 }; LOGFONT log = { 0 }; InitCommonControls(); //Setting the CHOOSEFONT structure cf.lStructSize = sizeof(CHOOSEFONT); cf.hwndOwner = (HWND)NULL; cf.lpLogFont = &log; cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_NOFACESEL | CF_NOSIZESEL | CF_NOSTYLESEL; cf.nFontType = SCREEN_FONTTYPE; cf.nSizeMin = 24; ChooseFont(&cf); return 0; } }
Der Fehler zeigte sich unter Windows 10 als auch unter Windows 7. Ich habe sogar testweise die Common Controls V6.0.0.0 im Manifest eingebunden.
---
Mal zum Hintergrund der Sache. Ich nutze gvim und habe festgestellt dass das Programm bei der Auswahl der Schrift unter einigen Rechnern abstürzt. Also habe ich das Programm selbst gedebuggt und bin mittels Application Verifier auf das ChooseFont() Problem gestoßen.
-
Vielleicht liegts am Compiler. Bei mir geht ChooseFont auf Win XP, Vista, 7 8 und 10 ohne Probleme. Nutze VS 2005 und VS2010
-
So direkt fällt mir da jetzt kein Fehler auf.
Wie sieht denn der Callstack aus wenn das Programm crasht? Und welchen Compiler verwendest du? (gvim ist ja nur ein Editor wenn ich das richtig verstehe.)
-
Mach doch einen Supportcase by MS auf...
-
@Cooper Hawks:
Auch wenn du den Application Verifier für das Programm aktiviert hast? Denn ohne Application Verifier scheint es in sehr vielen Fällen zu funktionieren. Doch bei aktiviertem Application Verifier, genauer den Heap Tests, stürzt das Ganze immer ab.@hustbaer
Ich nutze Visual Studio Express 2013. Aber selbst unter Visual Studio 2010 Express taucht der Fehler auf. Application Verifier ist in der Version 6.3.9600. Unicode oder ASCII Version spielen keine Rolle. Das Programm ist als 32Bit Exe kompiliert worden. Die 64Bit Variante habe ich nicht ausprobiert. Wohl aber die 64Bit Variante von gVim. Und die stürzt auch bei aktivem Application Verifier ab.Das Programm gvim.exe müsste eigentlich bekannt sein. Es ist die Windows Variante des uralten Vim Editors. Vim und Emacs sind zwei uralte Unix Editoren. Der Vim taucht übrigens auch bei einem git commit auf.
Ich habe das Ganze mal unter WinDbg laufen lassen, da hier die Ausgabe besser ist.
ModLoad: 75760000 757c0000 C:\Windows\SysWOW64\IMM32.DLL
ModLoad: 75e50000 75f1d000 C:\Windows\syswow64\MSCTF.dll
ModLoad: 73b60000 73be0000 C:\Windows\SysWOW64\uxtheme.dll
ModLoad: 74ea0000 74eb3000 C:\Windows\SysWOW64\dwmapi.dll
ModLoad: 6c550000 6c569000 C:\Windows\SysWOW64\fms.dll
(17c8.154c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
fms!GetNameRecordsFromNameTable+0x58:
6c553e69 66394efc cmp word ptr [esi-4],cx ds:002b:07019006=????
0:000:x86> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
********************************************************************************** WARNING: Unable to verify checksum for Test.exe
FAULTING_IP:
fms!GetNameRecordsFromNameTable+58
6c553e69 66394efc cmp word ptr [esi-4],cxEXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000000006c553e69 (fms!GetNameRecordsFromNameTable+0x0000000000000058)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: 0000000007019006
Attempt to read from address 0000000007019006FAULTING_THREAD: 000000000000154c
PROCESS_NAME: Test.exe
ERROR_CODE: (NTSTATUS) 0xc0000005 - Die Anweisung in 0x%08lx verweist auf Speicher 0x%08lx. Der Vorgang %s konnte nicht im Speicher durchgef hrt werden.
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - Die Anweisung in 0x%08lx verweist auf Speicher 0x%08lx. Der Vorgang %s konnte nicht im Speicher durchgef hrt werden.
EXCEPTION_PARAMETER1: 0000000000000000
EXCEPTION_PARAMETER2: 0000000007019006
READ_ADDRESS: 0000000007019006
FOLLOWUP_IP:
fms!GetNameRecordsFromNameTable+58
6c553e69 66394efc cmp word ptr [esi-4],cxMOD_LIST: <ANALYSIS/>
NTGLOBALFLAG: 2000100
APPLICATION_VERIFIER_FLAGS: 81643027
BUGCHECK_STR: APPLICATION_FAULT_INVALID_POINTER_READ_ZEROED_STACK
PRIMARY_PROBLEM_CLASS: INVALID_POINTER_READ
DEFAULT_BUCKET_ID: INVALID_POINTER_READ
LAST_CONTROL_TRANSFER: from 000000006c55fdf9 to 000000006c553e69
STACK_TEXT:
002bed38 6c55fdf9 00000001 07018168 0701804c fms!GetNameRecordsFromNameTable+0x58
002bedb4 6c553b0f 07017ef8 07084cd0 07018ff6 fms!GetFontNameTables+0x599
002bedf8 6c5539f2 07017ef8 07084cd0 0709d970 fms!GetOpenTypeTableProps+0x316
002beebc 6c553909 07017ef8 07084c68 07084cd0 fms!GdiPopulateFontNameProps+0xc2
002beedc 6c5538ae 07017ef8 07084c68 07084cd0 fms!SysEnumPopulateFontNameProps+0x31
002bef00 6c55363a 07017e08 07084c68 07084cd0 fms!PopulateFontProperties+0x77
002bef38 6c553756 07084c68 07017ef8 070d72b0 fms!AddFamilyFontInfoEntries+0x135
002bef54 6c555ae3 6c553555 07017ef8 00000001 fms!ForEachFontFamily+0x9c
002bef90 6c5559d7 0004982c 00000001 07017e08 fms!EnumerateFontFamilies+0x110
002befa4 6c555831 07017e08 00000000 80000000 fms!InitializeEnumeratorInternal+0x33
002befbc 753afef6 753e75c0 00000000 00000000 fms!FmsInitializeEnumerator+0x1d5
002befd4 753b2225 002bf014 00000000 00000001 COMDLG32!CCachedEnumerator::Get+0x7b
002bf2dc 753b2187 753b18de 00000001 002bf2fc COMDLG32!EnumFamilies+0x45
002bf518 753b1e11 000c03fc 00000000 00380101 COMDLG32!GetFontFamily+0x73
002bf5d4 753b1c3f 002bf9f8 000c03fc 00040506 COMDLG32!HandleFontDlgInitialize+0x241
002bf658 75c962fa 000c03fc 00000110 00040506 COMDLG32!FormatCharDlgProc+0x280
002bf684 75cbf9cf 753b02c1 000c03fc 00000110 USER32!InternalCallWinProc+0x23
002bf700 75cbf777 00000000 753b02c1 000c03fc USER32!UserCallDlgProcCheckWow+0xd7
002bf750 75cbf87c 0766bf90 00000000 00000110 USER32!DefDlgProcWorker+0xb7
002bf770 75c962fa 000c03fc 00000110 00040506 USER32!DefDlgProcW+0x29
002bf79c 75c96d3a 75cbf853 000c03fc 00000110 USER32!InternalCallWinProc+0x23
002bf814 75c9965e 00000000 77882d84 000c03fc USER32!UserCallWinProcCheckWow+0x109
002bf858 75cc205f 0766bf90 00000000 77882d84 USER32!SendMessageWorker+0x581
002bf92c 75cbda5b 75390000 00000007 00000000 USER32!InternalCreateDialog+0xb9f
002bf964 75cbd99a 75390000 08c49444 00000000 USER32!InternalDialogBox+0xc1
002bf984 75cbd71e 75390000 08c49444 00000000 USER32!DialogBoxIndirectParamAorW+0x37
002bf9a4 753afd85 75390000 08c49444 00000000 USER32!DialogBoxIndirectParamW+0x1b
002bf9e0 753cb79c 002bf9f8 7efde000 002bfba0 COMDLG32!ChooseFontX+0x31e
002bfa3c 00c71475 002bfb5c 00000000 00000000 COMDLG32!ChooseFontA+0x18d
002bfba0 00c71a59 00000001 06576fd8 0654cf28 Test!main+0xa5 [t:\test\test\main.cpp @ 32]
002bfbf0 00c71c4d 002bfc04 75ae336a 7efde000 Test!__tmainCRTStartup+0x199 [f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c @ 626]
002bfbf8 75ae336a 7efde000 002bfc44 77a79902 Test!mainCRTStartup+0xd [f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c @ 466]
002bfc04 77a79902 7efde000 778c8b9f 00000000 kernel32!BaseThreadInitThunk+0xe
002bfc44 77a798d5 00c71118 7efde000 00000000 ntdll32!__RtlUserThreadStart+0x70
002bfc5c 00000000 00c71118 7efde000 00000000 ntdll32!_RtlUserThreadStart+0x1bSYMBOL_STACK_INDEX: 0
SYMBOL_NAME: fms!GetNameRecordsFromNameTable+58
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: fms
IMAGE_NAME: fms.dll
DEBUG_FLR_IMAGE_TIMESTAMP: 4ce7b81f
STACK_COMMAND: ~0s ; kb
FAILURE_BUCKET_ID: INVALID_POINTER_READ_c0000005_fms.dll!GetNameRecordsFromNameTable
BUCKET_ID: X64_APPLICATION_FAULT_INVALID_POINTER_READ_ZEROED_STACK_fms!GetNameRecordsFromNameTable+58
Followup: MachineOwner
@Martin Richter
Mach doch einen Supportcase by MS auf...
Kann ich machen. Wird bloß etwas dauern, da mein Terminkalender voll ist und ich aktuell noch den Microsoft Support nicht kenne.
-
Das sieht mir eher nach einem kaputten Font aus.
Ich habe es nicht nachgespielt. Kannst Du das auf jedem Rechner nachvollziehen?Und wenn es nur im App-Verifier kracht heißt das noch nichts... Die Exception kann ja behandelt werden. Wird sie das?
-
Den Application Verifier hab ich nicht installiert. Ich wüste auch nicht wie das Teil zu bedienen ist.
-
Laut MSDN:
Under Comctl32.dll version 6.0 and later, InitCommonControls does nothing. Applications must explicitly register all common controls through InitCommonControlsEx.