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.


  • Mod

    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. 😕


  • Mod

    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.)


  • Mod

    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],cx

    EXCEPTION_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 0000000007019006

    FAULTING_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],cx

    MOD_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+0x1b

    SYMBOL_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.


  • Mod

    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.


Anmelden zum Antworten