Компонент Tperlregex фатальная ошибка L3169? - PullRequest
4 голосов
/ 26 ноября 2011

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

reg: Tperlregex;

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

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

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

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

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

@ Андреас Большое спасибо за ваш немедленный ответ.Я использую 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} 

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

1 Ответ

10 голосов
/ 26 ноября 2011

В 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;
...