Как решить внутреннюю ошибку Delphi [Pascal Fatal Error] F2084:ЛА33?

StackOverflow https://stackoverflow.com/questions/153388

  •  03-07-2019
  •  | 
  •  

Вопрос

Меня действительно тошнит от этой проблемы.Поисковые запросы Google, похоже, всегда предлагают "удалить все bpl для пакета", "удалить все dcu".Иногда это просто-не-работает.Надеюсь, я смогу почерпнуть здесь еще какие-нибудь идеи.

У меня есть собственный пакет, который был установлен без проблем несколько месяцев назад.Внеся несколько изменений в исходный код, я решил, что пришло время перекомпилировать / переустановить пакет.Теперь я получаю две ошибки, первая, если я выбираю "установить", это

Нарушение прав доступа по адресу 02422108 в модуле 'dcc100.dll'.Считывание адреса 00000000.

... или если я попытаюсь собрать / скомпилировать пакет, я получу

[Неустранимая ошибка Pascal] Внутренняя ошибка F2084:ЛА33

Это одна из тех проблем Delphi, которая, кажется, возникает снова и снова у многих из нас.Было бы здорово, если бы мы могли сопоставить ответ примерно так: "любой из этих шагов или их комбинация мог бы исправьте это, но если вы это сделаете ВСЕ эти шаги это будет исправь это...."

На данный момент я удалил все ссылки на файлы btl / dcp для этого пакета, но по-прежнему получаю ту же ошибку...

Использование BDS2006 (Delphi)

Обновление 01-Октябрь-2008:Мне удалось решить эту проблему - смотрите мой пост ниже.Поскольку я не могу принять свой собственный ответ, я не совсем уверен, что здесь делать.Очевидно, что подобные проблемы часто возникают у некоторых людей, поэтому я оставлю этот вопрос открытым на некоторое время, чтобы получить другие предложения.Тогда, я думаю, если кто-нибудь соберет всю информацию в супер-пост, я смогу принять ответ

Это было полезно?

Решение

Мне удалось решить эту проблему, следуя приведенной ниже процедуре

  1. Создайте новый пакет
  2. Один за другим добавляйте компоненты в пакет, компилируйте и устанавливайте, пока не произойдет сбой.
  3. Исследуйте устройство, вызвавшее неисправность.

Как оказалось, рассматриваемый модуль имел постоянный массив класса, например

TMyClass = class(TComponent)
private
  const ErrStrs: array[TErrEnum] of string
    = ('', //erOK
       'Invalid user name or password', //erInvUserPass
       'Trial Period has Expired'); //erTrialExp
protected
  ...
public
  ...
end;

Таким образом, похоже, что Delphi не любит константы класса (или, возможно, массивы констант класса) в компонентах пакета

Обновить:и да, об этом было сообщено codegear

Другие советы

Это ошибки в компиляторе / компоновщике.Вы можете найти множество ссылок на эти ошибки в Интернете в разных версиях Delphi, но это не всегда одни и те же ошибки.Это затрудняет поиск единого решения для всех этих различных проблем.

Как вы отметили, общими решениями, которые могли бы это исправить, являются:

  • Удалить *.dcp *.dcpil *.dcu *.dcuil *.btl *.dll
  • Перепишите свой код другим способом
  • Повозитесь с опциями компилятора
  • Получите последнюю версию Delphi

Я лично обнаружил, что одна из таких ошибок была устранена, если я отключил проверку диапазона.Другие решаются, если вы не используете дженерики из другого подразделения.И одна из них была решена, если название единицы измерения и название класса были переименованы, чтобы быть меньше.

И, конечно же, вы должны сообщать о любой возникшей у вас проблеме на http://qc.codegear.com

Возможно, следующий шаг будет лучшим решением:
Объявите массив как тип и просто определите константу класса с этим типом, например.

TMyArray = array[TErrEnum] of string;

TMyClass = class(TComponent)
private
  const ErrStrs: TMyArray
    = ('', //erOK
       'Invalid user name or password', //erInvUserPass
       'Trial Period has Expired'); //erTrialExp
protected
  ...
public
  ...
end;

Это делает объявление массива явным.

Я потратил несколько часов на эту проблему, удаляя dcu и т.д. безрезультатно.

Наконец, что сработало для меня, так это снять флажок Проверка переполнения в параметрах компилятора, перестроить проект, перепроверить проверку переполнения и снова перестроить.Вуаля!проблема исчезла.Пойди разберись.(все еще использую D7).

У меня был похожий случай, когда решением было удалить файл urlmon.dcu из /lib/debug.

Это также сработало, чтобы полностью отключить "использовать debug .dcu".Это, конечно, нежелательно, но вы можете использовать это, чтобы проверить, связана ли проблема с каким-либо из ваших собственных модулей или с любым из модулей delphi.

Попробуйте очистить "Выходной каталог", чтобы Delphi не смог оштрафовать dirty .DCU, и он вынужден удалить файл .PAS.Иногда это помогает.Если вы не настроили "выходной каталог", попробуйте удалить (или лучше переместить в папку резервной копии) все файлы .DCU.

Обновление Delphi XE3 2

Внутренняя ошибка F2084:URW1147

СЛУЧАЙ 1:

проблема заключалась в том, что тип был объявлен в процедуре универсального класса.

procedure TMyClass<TContainerItem, TTarget>.Foo();
type
  TCacheInfo = record
    UniqueList: TStringList;
    UniqueInfo: TUniqueInfo;
  end;
var
  CacheInfo: TCacheInfo;

перемещение объявления типа в закрытую часть объявления класса решило эту проблему.

СЛУЧАЙ 2:

проблема в данном случае была связана с необязательным параметром:

unit A.pas;
interface
type
  TTest<T> = class
  public
    type
      TTestProc = procedure (X: T) of object;
    constructor Create(TestProc_: TTestProc = nil);
  end;
...

внутренняя ошибка компиляции произошла, как только переменная класса TTest была объявлена в другом модуле:например ,

unit B.pas:

uses A;
var
  Test: TTest<TObject>;

решение состояло в том, чтобы сделать аргумент конструктора TestProc_ обязательный.

Для меня, в D2010 отключение опции компилятора "Выдавать информацию о типе среды выполнения" сделало свое дело.

Отключение "Включать символы удаленной отладки" в параметрах компоновщика устранило проблему для меня Delphi 2007, dll project

Судя по различным ответам, эта ошибка выглядит как общее необработанное компилятором исключение.

Моя проблема была вызвана ошибочным вызовом function X(someString:String) : Boolean; который изменил строку и вернул логическое значение, используя someString := X(someString);

Поскольку мой опыт работы с внутренними ошибками таков, я переписал построчно и скомпилировал снова и понял, что некоторые инструкции if else работают не так, как

Возникает Внутренняя ошибка

 if (DataType in ASet) 
    begin
 //do work
    end
    else if (DataType = B)
    begin
 //do work
    end
    else 
    begin
 //do work
    end;

Как я решил :

if (DataType = B)
        begin
     //do work
        end
        else if (DataType in ASet) 
        begin
     //do work
        end
        else 
        begin
     //do work
        end;

Просто поменял условия в качестве примера.Надеюсь, это поможет.

Я только что столкнулся с подобным поведением, приведшим к внутренней ошибке LA30.Причиной были недавно добавленные строковые константы.После перехода с const cLogFileName : string = 'logfilename.log';

Для const cLogFileName = 'logfilename.log';

(и, конечно же, перезапуск Delphi IDE) ошибка больше не появлялась.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top