Советы по Delphi

         

DLL и управление памятью


...я сомневаюсь в том, что GPF вызвана нехваткой памяти. Если это была нехватка кучи, вы должны были получить ошибку Error 202. В отношение кучи памяти: Windows поддерживает виртуальную глобальную память, поэтому нормальный признак нехватки реальной памяти - сильное замедление работы системы, а никак не GPF.

Из раздела "Writing DLLs" электронной справки:

Глобальные переменные: DLL имеет собственный сегмент данных, и любые переменные, объявленные в DLL, являются локальными для этой DLL. DLL не может иметь доступ к переменным, объявленным в модулях, которые вызвали данную DLL, более того, DLL не может экспортировать свои переменные для того, чтобы их использовали другие модули. Такой доступ должен происходить через процедурный интерфейс.

DLLs и сегменты стека: DLL не имеет собственного сегмента стека, поэтому она использует сегменты кучи приложения, которое вызвало DLL.

Также обратитесь к совету "Run-time errors in DLLs" (ошибки DLL времени выполнения)

При возникновении в DLL ошибки во время выполнения приложения, вероятно, лучшим решением будет полное завершение сеанса работы Windows. Если вы просто попытаетесь изменить и пересобрать код проблемной DLL, то при повторном запуске вашей программы Windows не загрузит новую версию вашей DLL, т.к. старая будет находится еще в памяти. Перегрузив Windows и Delphi вы можете быть уверены в том, что будет загружена новая, скорректированная версия DLL.

Чтобы найти проблему в коде DLL, нужно собрать стандартное EXE-приложение, и посмотреть его в отладчике на предмет возможных ошибок (напомню, что речь идет о Delphi 1).

Если вы когда-либо разрабатывали серьезную DLL, то вы должны знать, что при получении GPF перезагрузка каждый раз Windows является уж слишком непрактичным делом. Можно попытаться убрать DLL из памяти, перекомпилировать, и работать дальше. И я делал это нескончаемое число раз. Также, для того чтобы найти ошибку, я перемещал код библиотеки в 'нормальный' модуль, компилировал обычный EXE, и отлаживал его. Например, в Turbo Debugger for Windows, входящий в поставку RAD. Для отладки в нем DLL, необходимо просто установить точку 'жесткую' разрыва, добавляя в место необходимой остановки, или в точку входа в DLL строку 'inline($cc);'. Это "разбудит" отладчик, и вы сможете поработать с вашим кодом. [001978]



Содержание раздела