Неустранимая ошибка компонента Tperlregex L3169?

Некоторое время пользуюсь Tperlregex. но сегодня, когда я пытаюсь скомпилировать приложение, созданное с помощью Tperlregex, появляется сообщение «фатальная ошибка: внутренняя ошибка L3169».

reg: Tperlregex;

begin
reg:=Tperlregex.create(nil); //If this line is removed, there is no error prompt.
...
...
end;

Я использую Perlregex2009.

Пожалуйста помоги.

Редактировать:

Андреас, большое спасибо.

@Andreas Большое спасибо за ваш немедленный ответ. Я использую Delphi 7. Работает ли ваш ответ в D7. И я нахожу примечания в pcre.pas (..Delphi 2009 и ранее) содержат ошибку компилятора, которая может вызвать внутреннюю ошибку, если установить TPerlRegEx в пакет времени разработки, и вы не помещаете TPerlRegEx в пакет времени выполнения одновременно. В Delphi 2009 и ранее вы можете использовать PCRE_STATICLINK, если вы вообще не используете пакеты (что означает, что вы не устанавливаете его в IDE ... "). Я не устанавливал его в IDE, и я помещаю модуль perlregex в использует интерфейс. и я установил эти строки в pcre.pas

 ...
{$DEFINE PCRE_LINKDLL}
{$IFDEF PCRE_STATICLINK}
{$UNDEF PCRE_LINKDLL}
{$ENDIF} 

Раньше работало. Но сегодня это не так.


person Warren    schedule 26.11.2011    source источник


Ответы (1)


В Delphi 2009 возникла проблема с экспортом файлов * .obj. Функция pcre_exec должна вызываться из кода. Если «умный компоновщик» Delphi удаляет его, потому что он не вызывается нигде в коде (который не удаляется умным компоновщиком), компилятор терпит неудачу. Это ошибка компилятора, но ее можно обойти, внеся небольшое изменение в библиотеку PerlRegEx. Вы должны добавить локальную процедуру «UseFunction» (и ее вызов) в конструктор TPerlRegEx.Create. Поэтому, когда вы создаете объект TPerlRegEx, интеллектуальный компоновщик не удаляет функцию pcre_exec.

constructor TPerlRegEx.Create(AOwner: TComponent);

  procedure UseFunction(P: Pointer);
  begin
  end;

begin
  UseFunction(@pcre_exec); // if not used, D2009 will fail with internal compiler error
  UseFunction(@pcre_compile); // if not used, D7 will fail with internal compiler error
  inherited Create(AOwner);
end;
person Andreas Hausladen    schedule 26.11.2011
comment
Большое спасибо за ваш немедленный ответ, пожалуйста, смотрите мою правку выше. - person Warren; 26.11.2011
comment
+1. Я столкнулся с той же проблемой, использовал аналогичное решение. - person davea; 26.11.2011
comment
Я обновил код, чтобы также обойти ошибку компилятора D7. - person Andreas Hausladen; 26.11.2011
comment
@Andreas Большое спасибо. Ваш ответ решает это. Вы так добры. Я до сих пор не знаю, почему раньше это работало хорошо. - person Warren; 27.11.2011
comment
Он работает, если вы вызываете метод Match. Если вы этого не сделаете, интеллектуальный компоновщик удалит код, и компилятор обнаружит внутреннюю ошибку. - person Andreas Hausladen; 27.11.2011
comment
@Andreas, отлично. Еще раз спасибо. - person Warren; 29.11.2011
comment
Этот ответ был очень полезным! - person boileau; 13.03.2012