Pergunta

Eu estou realmente doente deste problema. Pesquisas do Google sempre parecem sugerir "apagar todos os BPLS para o pacote", "excluir todos DCUs". Às vezes isso just-fazer-não-trabalho. Espero que eu possa obter algumas outras idéias aqui.

Eu tenho um pacote escrito em-casa, que tinha sido instalado sem problema há alguns meses. Tendo feito algumas mudanças para a fonte, achei que era hora de recompilar / reinstalar o pacote. Agora eu tenho dois erros, o primeiro se eu escolher "instalar" é

Violação de acesso no endereço 02422108 no módulo 'dcc100.dll'. Leia de endereço 00000000.

... ou se eu tentar construir / compilar o pacote, recebo

[Pascal Fatal Error] Erro F2084 Interno: LA33

Este é um daqueles problemas Delphi que parece ocorrer uma e outra vez para muitos de nós. Seria ótimo se pudéssemos reunir um algo resposta ao longo das linhas de "qualquer um ou uma combinação destes passos pode corrigi-lo, mas se você todas estes passos ele irá corrigi-lo .... "

No momento, eu removi todas as referências aos BPL / DCP arquivos para este pacote, mas ainda obter o mesmo erro ...

Usando BDS2006 (Delphi)

Atualização 01-Oct-2008: eu consegui resolver este - veja meu post abaixo. Como eu não posso aceitar a minha própria resposta, eu não sou inteiramente certo o que fazer aqui. Obviamente, esses tipos de problemas ocorrem com freqüência para algumas pessoas, por isso vou deixá-la aberta por um tempo para obter outras sugestões. Então eu acho que se alguém reúne todas as informações em um super-post, posso aceitar a resposta

Foi útil?

Solução

Eu consegui resolver isso, seguindo o procedimento abaixo

  1. Criar um novo pacote
  2. Um por um, adicionar os componentes para o pacote, compilar e instalar, até que ele falhou.
  3. Investigar a unidade causando a falha.

Como se vê, a unidade em questão tinham uma matriz de classe constante, por exemplo,

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;

Assim, parece que Delphi não gosta constantes de classe (ou talvez matrizes constantes de classe) em componentes do pacote

Update: e sim, isso tem sido relatada a CodeGear

Outras dicas

Estes são bugs no compilador / vinculador. Você pode encontrar muitas referências destes erros na Internet em diferentes versões do Delphi, mas eles não são sempre os mesmos erros. Isso faz com que seja difícil dar uma solução para todos os diferentes tipos de problemas.

soluções

Gerais que possam corrigi-lo são, como você observou:

  • Remove * .dcp * .dcpil * .dcu * .dcuil * .bpl * .dll
  • Reescreva o código de outra maneira
  • Tinker com opções do compilador
  • Obtenha a última versão Delphi

Eu, pessoalmente, encontrou um dos tais erros para ser resolvido se eu desliguei Faixa Verificação. Outros são resolvidos se você não usar os genéricos de outra unidade. E um foi resolvido se o nome do nome da unidade e classe foi renomeada a ser menores.

E, claro, você deve relatar qualquer problema que você tem em http://qc.codegear.com

Talvez o passo seguinte será uma solução melhor:
Declarar a matriz como um tipo e apenas define a constante de classe com este tipo, por exemplo.

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;

Isso faz com que a declaração de matriz explícita.

I desperdiçado várias horas sobre esta questão, a exclusão de DCU de, etc sem sucesso.

Finalmente, o que funcionou para mim foi desmarque verificação de estouro em Opções do compilador, a reconstrução do projeto, verificando re-verificação de estouro, e reconstruir novamente. Voila! o problema desapareceu. Vai saber. (Ainda usando D7).

Eu tive um caso semelhante, onde a solução era remover o urlmon.dcu arquivo de / lib / debug.

Ele também trabalhou para desligar "o uso de depuração .dcus" completamente. Isto, obviamente, não é desejável, mas você pode usá-lo para verificar se as mentiras problema com qualquer de suas próprias unidades, ou com qualquer uma das unidades da Delphi.

Tente limpar o "Output Directory" para Delphi não pode muito bem sujo .DCUs e ele é forçado a Bould os .PAS. Às vezes isso ajuda. No caso de você não configurar um "diretório de saída", tente excluir (ou melhor se movendo em uma pasta de backup) todos os arquivos .dcu.

Delphi XE3 Update 2

F2084 Erro interno: URW1147

CASE 1:

problema era que um tipo foi declarado em um procedimento de uma classe genérica.

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

mover a declaração de tipo para a parte privada da declaração da classe resolvido esta questão.

CASE 2:

problema neste caso estava relacionado com um parâmetro opcional:

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

o erro de compilação interna ocorreu assim que uma variável da classe TTest foi declarado em outra unidade: por exemplo,

unit B.pas:

uses A;
var
  Test: TTest<TObject>;

solução foi fazer o argumento do construtor de TestProc_ não opcional.

Para mim, em D2010 desabilitar a opção do compilador "Emit tipo runtime informação" fez o truque.

A desativação "Incluir símbolos de depuração remotos" entre as opções vinculador fixas a questão para mim Delphi 2007, dll projeto

A partir das várias respostas Isso parece erro para ser uma exceção não tratada genérico pelo compilador.

O meu problema foi causado por engano chamando function X(someString:String) : Boolean; que alterou a corda e voltou um booleano, usando someString := X(someString);

Como a minha experiência de erro interno é que, eu re-escreveu linha por linha e compilar novamente e percebeu que alguns se outra declaração não funciona como

erro interno

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

Como eu resolvi:

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

Apenas trocou as condições que example.Hope que ajuda.

Eu só experimentou um comportamento semelhante, resultando em LA30 erro interno. A razão foram adicionados recentemente constantes string. Depois de mudar a partir de const cLogFileName : string = 'logfilename.log';

para const cLogFileName = 'logfilename.log';

(e, claro, o reinício da Delphi IDE) o erro foi não aparecendo mais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top