TDirectoryListBox - ошибка ввода-вывода 183 при первом выборе - PullRequest
0 голосов
/ 10 января 2012

У меня есть приложение, в котором я получаю ошибку ввода-вывода 183, как только я выбираю каталог с TDirectoryListBox в первый раз. После этого все работает как положено.

Это поведение не зависит от формы, в которую я помещаю Box, накопителя и многих других настроек, которые я пытался изменить.

Но когда я создаю новое приложение и помещаю туда TDirectoryListBox, оно работает без проблем.

Я думаю, что это очень странно, поскольку ошибка ввода-вывода 183 - это ERROR_ALREADY_EXISTS, которая не должна происходить с TDirectoryListBox.

Я использую Delphi 2007.

Может кто-нибудь сказать мне, почему это происходит и как решить проблему?

1 Ответ

0 голосов
/ 13 октября 2013

Похоже, что оконный менеджер пытается создать окно, которое уже существует. Используйте флаги компилятора $ IOCHECKS и $ I- , чтобы подавить его. Вот более подробное объяснение:

Давайте начнем с 16-битных оконных дескрипторов. Это просто: они просто указатели на сегмент данных оконного менеджера, приведенный к типу данных HWND. Поскольку оконный менеджер имел один сегмент данных размером 64 КБ, все эти указатели были 16-разрядными значениями.

Когда менеджер окон создал 32-битную кучу, он очень хорошо спросил 32-битный менеджер кучи, может ли он вернуть 16-битные дескрипторы вместо 32-битных. Менеджер кучи сделал это, предварительно выделив блок памяти размером 64 КБ и выделив его дескрипторы из этого блока памяти, используя смещение в блоке в качестве дескриптора.

Поскольку каждая запись в таблице дескрипторов составляет четыре байта (32-битный указатель), таблица дескрипторов 64 КБ может содержать до 16384 записей. Вот почему документация для CreateWindowEx включает следующее замечание:

    Windows 95/98/Me: The system can support a maximum of 16,384 window handles.

На самом деле, это было немного меньше, потому что некоторые записи были потеряны на накладные расходы. Например, нулевое значение дескриптора не может быть использовано, потому что это может быть перепутано с NULL.

Как 16-разрядная техника Windows, так и техника Windows 95 действительно страдали от проблемы повторного использования дескриптора. Когда окно уничтожается, его память освобождается (как и его дескриптор в Windows 95). Когда создается новое окно, есть большая вероятность того, что память или дескриптор будут повторно использованы, и, следовательно, числовое значение дескриптора окна снова становится действительным, но ссылается на другое окно.

Так получилось, что загрузки программ (и «загрузки» - технический термин) содержат ошибки, в которых они используют дескрипторы окон после того, как окно было уничтожено. Когда дескриптор окна используется повторно, эта программа отправляет сообщение окну, которое, по ее мнению, все еще там, но вместо этого оно отправляет сообщение совершенно не связанному окну. Это не сулит ничего хорошего для программы, и обычно это не сулит ничего хорошего для нового окна, которое также получило сообщение по ошибке.

Ссылки

...