Компонент 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
@Андреас, страхотно. Благодаря отново. - person Warren; 29.11.2011
comment
Този отговор беше много полезен! - person boileau; 13.03.2012