Из-за исследований на разных сайтах может случиться так, что при использовании CloseHandle для дескриптора, возвращаемого GetStdHandle, могут произойти неприятности. Часто кажется, что ответом людей является то, что, поскольку он получает дескриптор, а не создает его (поскольку слово Get, а не Create входит в имя функции), должно быть очевидно, что он получает дескриптор, созданный системой, и что закрывать это плохая идея. Тем не менее, фактический ответ не так очевиден (к сожалению). Хотя это верно для GetStdHandle, не каждая функция Get, связанная с дескрипторами, фактически получает существующий дескриптор. Некоторые создают новые ручки. Например, GetDC фактически создает новый дескриптор контекста устройства, и, поскольку он является новым дескриптором, он должен быть надлежащим образом закрыт с помощью CloseHandle. В отличие от ответов некоторых людей, не существует правила, согласно которому, если функция содержит слово Create, она создает новый дескриптор, а если она содержит слово Get, она ссылается только на дескриптор, уже созданный системой. Нет такого правила вообще. Как вы узнаете, когда ручку нужно закрыть? Один из способов заключается в том, что если MSDN специально не указывает, что CloseHandle необходимо использовать для дескриптора, возвращаемого такой-то функцией, то можно с уверенностью предположить, что вам НЕ следует использовать CloseHandle для этого дескриптора. Еще один способ понять это методом проб и ошибок. Если использование CloseHandle приводит к тому, что в вашей программе появляется больше ошибок, НЕ используйте CloseHandle. Если НЕ использование CloseHandle приводит к тому, что ваша программа имеет больше ошибок, используйте USE CloseHandle. Я часто использую комбинацию этих подходов. Если после следования документации MSDN моя программа, похоже, содержит ошибки, но выполнение ее не так, как указано в MSDN, имеет тенденцию уменьшать количество ошибок в моей программе, я выбираю то, что, как я определил, работает методом проб и ошибок.