Выполните команду Project|Settings и перейдите на вкладку Debug. Выберите из списка Category строку Additional DLL. Открывается список DLL, которые Visual C++ пытается загрузить при отладке вашей программы (независимо от того, включена удаленная отладка или нет). Чтобы отказаться от переназначения DLL (для нормальной отладки вам не потребуется ни один из элементов этого списка), выделите соответствующую строку и снимите флажок в левом верхнем углу. Список Additional DLLs с некоторыми DLL, необходимыми для типичных приложений MFC, изображен на рис. А.9.
Рис. А.9. Окно Additional DLLs
Отладочные сообщения DirectX
Вероятно, вы уже заметили, что при запуске приложений DirectX в окне вывода отладчика Visual C++ появляются диагностические сообщения. По умолчанию отладочные версии компонентов DirectX сообщают таким образом о важных внутренних событиях — например, об ошибках. Типичное окно вывода для приложения DirectDraw изображено на рис. А.10.
СОВЕТ
Прислушивайтесь к крикам DirectX
При установке runtime-части DirectX на рабочий компьютер возникает искушение установить окончательные версии DLL вместо отладочных (во время инсталляции вам предлагается выбрать нужный вариант). Не поддавайтесь соблазну и не устанавливайте окончательные версии! Да, они действительно работают чуть быстрее, и именно с ними будут работать пользователи вашего приложения, но при этом вы лишитесь отладочного вывода. Если во время работы над программой возникнут проблемы, вы так и не узнаете, что же DirectX пытается вам сказать.
Рис. А.10. Типичное окно вывода в отладчике
Возможно, вы не знаете, что детальность этих сообщений тоже можно изменять. В каждой из библиотек DirectDraw, Direct3D и DirectSound можно выбрать пять разных уровней отладочных сообщений. Чтобы настроить уровень отладочных сообщений, выберите значок DirectX в Control Panel и перейдите на вкладку нужного компонента DirectX. Диалоговое окно DirectX Properties с выбранной вкладкой DirectDraw изображено на рис. А.11.
Рис. А.11. Окно DirectX Properties (запускается из Control Panel)
Для библиотеки DirectDraw нажмите кнопку Advanced Settings — откроется окно DirectDraw Advanced Settings. Нужный уровень отладочных сообщений устанавливается с помощью слайдера Debug Level. Окно DirectDraw Advanced Settings изображено на рис. А.12.
Рис. А.12. Окно DirectDraw Advanced Settings
При максимальном уровне отладки каждое приложение DirectDraw, запущенное в отладчике, выдает весьма обширный и подробный протокол. Вывод протокола снижает быстродействие программы, так что максимальный уровень не стоит держать включенным постоянно. С другой стороны, он сильно помогает в затяжной борьбе с DirectDraw. Чтобы показать, насколько подробная информация выдается при максимальном уровне отладки, я приведу отладочный протокол для небольшого полноэкранного приложения DirectDraw. Обратите внимание на то, что листинг раскрывает некоторые внутренние тонкости работы DirectDraw. Подробный отладочный протокол приведен в листинге А.1.
Листинг А.1. Подробный отладочный протокол DirectDraw
DDraw:====> ENTER: DLLMAIN(baaa12c0): Process Attach: fff00c89, tid=fff04bf1
DDraw:Thunk connects
DDraw:Signalling DDHELP that a new process has connected
DDraw:====> EXIT: DLLMAIN(baaa12c0): Process Attach: fff00c89
DDraw:createDC(R3D)
DDraw:Enumerating GUID aba52f41-f744-11cf-b4-52-00-00-1d-1b-41-26
DDraw: Driver Name = R3D
DDraw: Description = Righteous 3D DirectX II Driver
DDraw:DeleteDC 0x179e
DDraw:createDC(mm3dfx)
DDraw:Enumerating GUID 3a0cfd01-9320-11cf-ac-a1-00-a0-24-13-c2-e2
DDraw: Driver Name = mm3dfx
DDraw: Description = 3Dfx Interactive DirectX Driver
DDraw:DeleteDC 0x179e
DDraw:Only one Display device in the current system.
DDraw:DirectDrawCreate entered
DDraw: GUID *:00000000, LPLPDD:0064f870, pUnkOuter:00000000
DDraw:Registry already scanned, not doing it again
DDraw:full name = C:SAMPLEDEBUGSAMPLE.EXE
DDraw:name = SAMPLE.EXE
DDraw:DirectDrawCreate: pid = fff00c89
DDraw:Reading Registry
DDraw: ModeXOnly: 0
DDraw: EmulationOnly: 0
DDraw: ShowFrameRate: 0
DDraw: EnablePrintScreen: 0
DDraw: DisableMMX: 0
DDraw: DisableWiderSurfaces:0
DDraw: DisableNoSysLock:0
DDraw: ForceNoSysLock:0
DDraw:Signalling DDHELP to create a new DC
DDraw:createDC(display)
DDraw:DIRECTDRAW driver is wrong version, got 0x5250, expected 0x0100
DDraw:getDisplayMode:
DDraw: bpp=8, refresh=0
DDraw: dwHeight=600, dwWidth=800
DDraw: lStride=0
DDraw:Driver says nummodes=9
DDraw:Enum Display Settings says nummodes=9
DDraw:dwModeIndex = 1
DDraw:Masks for current mode are: 00000000 00000000 00000000
DDraw:DirectDrawObjectCreate: oldpdd == 00000000, reset=0
DDraw:DIRECTDRAW object passed in = 00000000
DDraw:oldpdd == 00000000, reset=0
DDraw:Driver Object: 2256 base bytes
DDraw:dwReserved3 of DDrawGbl is set to 0x0
DDraw:oldpdd == NULL || reset
DDraw:Driver can't blt
DDraw:pddd->lp16DD = 40cf0000
DDraw:Adding ModeX mode 320x200x8 (standard VGA flag is 0)
DDraw:Adding ModeX mode 320x240x8 (standard VGA flag is 0)
DDraw:Adding ModeX mode 320x200x8 (standard VGA flag is 1)
DDraw:All video memory heaps have been disabled. OS has no AGP support
DDraw:Current and Original Mode = 1
DDraw:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ MODE INDEX = 1
DDraw:DDHALInfo contains D3D pointers: 00000000 00000000
DDraw:createDC(display)
DDraw:NOT Setting DDCAPS_BANKSWITCHED
DDraw:DeleteDC 0x179e
DDraw:Taking the Win16 lock may not be necessary for VRAM locks
DDraw:DirectDrawObjectCreate: Returning global object 82dc11f8
DDraw:createDC(display)
DDraw:createDC(display)
DDraw:DeleteDC 0x175e
DDraw:DeleteDC 0x179e
DDraw:Primary's rect is 0, 0, 800, 600
DDraw:HELInit for DISPLAY Driver: Reference Count = 1
DDraw:createDC(display)
DDraw:DeleteDC 0x179e
DDraw:createDC(display)
DDraw:createDC(display)
DDraw:DeleteDC 0x175e
DDraw:DeleteDC 0x179e
DDraw:***New local allocated 82dc1b1c for global pdrv 82dc11f8
DDraw:New driver object created, interface ptr = 82dc1b84
DDraw: DirectDrawCreate succeeds, and returns ddraw pointer 82dc1b84
DDraw:New driver interface created, 82dc1bb0
DDraw:DD_AddRef, pid=fff00c89, obj=82dc1bb0
DDraw:DD_AddRef, Reference Count: Global = 2 Local = 2 Int = 1
DDraw:DD_Release, pid=fff00c89, obj=82dc1b84
DDraw:DD_Release, Ref Count: Global = 1 Local = 1 Interface = 0
DDraw:*********** ALLOWING MODE X AND VGA MODES
DDraw:DD_GetDeviceRect: display [0 0 800 600]
DDraw:Subclassing window 00000aac
DDraw:StartExclusiveMode
DDraw:******** invalidating all surfaces
DDraw:Enumerating mode 0. 640x480
DDraw:Enumerating mode 1. 800x600
DDraw:Enumerating mode 2. 1024x768
DDraw:Enumerating mode 3. 1280x1024
DDraw:Enumerating mode 4. 640x480
DDraw:Enumerating mode 5. 800x600
DDraw:Enumerating mode 6. 1024x768
DDraw:Enumerating mode 7. 640x480
DDraw:Enumerating mode 8. 800x600
DDraw:Enumerating mode 9. 320x200
DDraw:Enumerating mode 10. 320x240
DDraw:Enumerating mode 11. 320x200
DDraw:Looking for 640x480x8
DDraw:Found 640x480x8x (flags = 1)
DDraw:Found 800x600x8x (flags = 1)
DDraw:Found 1024x768x8x (flags = 1)
DDraw:Found 1280x1024x8x (flags = 1)
DDraw:Found 640x480x16x (flags = 0)
DDraw:Found 800x600x16x (flags = 0)
DDraw:Found 1024x768x16x (flags = 0)
DDraw:Found 640x480x32x (flags = 0)
DDraw:Found 800x600x32x (flags = 0)
DDraw:Found 320x200x8x (flags = 3)
DDraw:Found 320x240x8x (flags = 3)
DDraw:Found 320x200x8x (flags = 11)
DDraw:Calling HEL SetMode
DDraw:width = 640
DDraw:height = 480
DDraw:bpp = 8
DDraw:WM_DISPLAYCHANGE: 640x480x8
DDraw:DD_GetDeviceRect: display [0 0 640 480]
DDraw:WM_SIZE hWnd=AAC wp=0000, lp=01E00280
DDraw:WM_SIZE: Window restored, NOT sending WM_ACTIVATEAPP
DDraw:createDC(display)
DDraw:DeleteDC 0x1712
DDraw:createDC(display)
DDraw:createDC(display)
DDraw:DeleteDC 0x179e
DDraw:DeleteDC 0x1712
DDraw:createDC(display)
DDraw:getDisplayMode:
DDraw: bpp=8, refresh=0
DDraw: dwHeight=480, dwWidth=640
DDraw: lStride=0
DDraw:Driver says nummodes=9
DDraw:Enum Display Settings says nummodes=9
DDraw:dwModeIndex = 0
DDraw:Masks for current mode are: 00000000 00000000 00000000
DDraw:DirectDrawObjectCreate: oldpdd == 82dc11f8, reset=1
DDraw:DIRECTDRAW object passed in = 82dc11f8
DDraw:oldpdd == 82dc11f8, reset=1
DDraw:Driver Object: 2256 base bytes
DDraw:dwReserved3 of DDrawGbl is set to 0x0
DDraw:oldpdd == NULL || reset
DDraw:Driver can't blt
DDraw:******** invalidating all surfaces
DDraw:All video memory heaps have been disabled. OS has no AGP support
DDraw:Current and Original Mode = 0
DDraw:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ MODE INDEX = 0
DDraw:DDHALInfo contains D3D pointers: 00000000 00000000
DDraw:createDC(display)
DDraw:NOT Setting DDCAPS_BANKSWITCHED
DDraw:DeleteDC 0x179e
DDraw:Taking the Win16 lock may not be necessary for VRAM locks
DDraw:DirectDrawObjectCreate: Returning global object 82dc11f8
DDraw:createDC(display)
DDraw:createDC(display)
DDraw:DeleteDC 0x1776
DDraw:DeleteDC 0x179e
DDraw:Primary's rect is 0, 0, 640, 480
DDraw:DeleteDC 0x1712
DDraw:Looking for 640x480x16
DDraw:Found 640x480x8x (flags = 1)
DDraw:Found 800x600x8x (flags = 1)
DDraw:Found 1024x768x8x (flags = 1)
DDraw:Found 1280x1024x8x (flags = 1)
DDraw:Found 640x480x16x (flags = 0)
DDraw:Found 800x600x16x (flags = 0)
DDraw:Found 1024x768x16x (flags = 0)
DDraw:Found 640x480x32x (flags = 0)
DDraw:Found 800x600x32x (flags = 0)