Таблица дескриптори ядро обект
В същото време, функциите, които създават потребителски обекти или на GDI, има параметър тип
PSECURITY_ATTRIBUTES и пример за това - функция CreateIcon
HICON CreateIcon (HINSTANCE hinst. Int nWidth,
вътр nHeight, БАЙТ cPlanes, BYTE cBitsPixel,
CONST байт * pbANDbits, CONST байт * pbXORbits);
Таблица 3-1 показва как масата за дръжка, която принадлежи на процеса, както можете да видите, че това е просто набор от структури от данни Всяка структура съдържа указател към някои ядрото обект, маска за достъп, както и някои знамена
Ако преминете невалиден индекс (ЕВРОВОК), функцията се провали и GetLastError връща 6 (ERROR_INVALID_HANDLE). Това се дължи на факта, че всъщност дръжки са кодове, посочени в таблицата, стойностите им са обвързани с определен процес и nedeyovitelny в други процеси.
Ако извикването на функция, създаване на обект ядрото е неуспешна, след това обикновено се връща 0 (нула). Подобна ситуация е възможно само в случай на остър недостиг на памет, или ако имате проблеми със защита. За съжаление, някои функции връщат в такива случаи, СИ 0 и -1 (INVALID_HANDLE_VALUE) Например, ако CreateFile не можете да отворите даден файл, той се връща INVALID_HANDLE_VALUE. Бъдете много
Внимавайте, когато проверката на стойността връщане на функция, която създава обект ядро. Така че, за CreateMutex провери INVALID_HANDlE_VALUE безсмислен:
ДРЪЖКА hMutex = CreateMutex (.);
ако (hMutex == lNVALID_HANDLE_VALUE)
// този код никога няма да бъде екзекутиран като
// връща грешка, когато CreateMutex NLlLL
По същия начин, безсмислен и следния код:
HANDIE hFile = CreateFile (.); ако (hFile - NULL>
// и този код никога няма да бъде екзекутиран като
// връща когато грешка CreateFile lNVALID_HANDLE_VALUE (-1)
Закриване обект ядрото
Без значение как се създаде обект ядрото, след като е работил с него трябва да се обадя CloseHandle zakrp
BOOL CloseHandle (ДРЪЖКА hobj);
Тази функция първо проверява маса описания, принадлежащи към извикващия процес да се уверите, тя определя дали премина индекса (инвентаризация
Ако дръжката на неверниците, има едно от следните две неща. В нормален режим на изпълнение CloseHandle процес връща FALSE, а GetLastError - код
ERROR_INVALID_HANDLE. Но когато процесът в режим на отстраняване на грешки, системата просто не уведоми дебъгер за грешка.
Преди да върнат контрола CloseHandle изтрива запис от таблицата на описания: дескрипторната tspsr валидно в процеса и не можете да го използвате. В този случай, вписването се заличава, независимо дали обектът се унищожава от ядрото или не! След като нарече CloseHandle вече нямате достъп до това-
ц обект на ядрото; но ако броячът не се изключи, обектът остава в паметта Всичко е нормално, това просто означава, че обектът се използва от друг процес (или процеси). Когато останалата част от процеса ще приключи работата си с този обект (също като се обадите CloseHandle), тя ще бъде унищожена.
Какво става, ако сте забравили да се обадя CloseHandle - дали изтичане на памет е? Е, да, и не. изтичане на ресурса (един и същ обект на ядрото) е напълно възможно, а този процес все още работи. Въпреки това, след приключване на процеса на операционната система е гарантирано за облекчаване на всички ресурси, притежавани от този процес, както и в случай на ядрото обекти работи по следния начин: по време на процеса е пълно сканиране на трапезата му описания и затваря всички отворени дръжки.