如何解决Delphi的[Pascal致命错误] F2084内部错误:LA33?

时间:2008-09-30 14:48:39

标签: delphi install packages

我真的厌倦了这个问题。谷歌搜索似乎总是建议“删除包的所有bpls”,“删除所有dcus”。有时这只是不行。希望我能在这里得到一些其他想法。

我有一个内部写的包,几个月前没有问题安装。对源进行了一些更改后,我认为是时候重新编译/重新安装软件包了。现在我得到两个错误,第一个如果我选择“安装”是

模块'dcc100.dll'中地址02422108的访问冲突。读取地址00000000。

...或者如果我尝试构建/编译包,我会得到

[Pascal致命错误] F2084内部错误:LA33

对于我们中的许多人来说,这似乎是一次又一次出现的德尔福问题之一。如果我们可以按照“任何一个或这些步骤可能修复它的任何一个或组合的方式整理响应,那将是很好的,但如果你所有这些步骤 >将修复它....“

目前,我已删除了对此程序包的bpl / dcp文件的所有引用,但仍然收到相同的错误...

使用BDS2006(Delphi)

2008年10月1日更新:我设法解决了这个问题 - 请参阅下面的帖子。由于我不能接受我自己的答案,我不完全确定在这里做什么。显然,对于某些人来说,这些类型的问题经常发生,所以我会暂时保持开放以获得其他建议。然后我想如果有人将所有信息整理成超级帖子,我可以接受答案

12 个答案:

答案 0 :(得分:15)

我设法按照以下程序解决了这个问题

  1. 创建新包
  2. 逐个将组件添加到包中,编译和放大安装,直到失败。
  3. 调查造成失败的单位。
  4. 事实证明,有问题的单位有一个类常数数组,例如

    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报告

答案 1 :(得分:4)

这些是编译器/链接器中的错误。您可以在不同的Delphi版本中找到这些错误的许多参考,但它们并不总是相同的错误。这使得很难为所有这些不同类型的问题提供一种解决方案。

正如您所指出的那样,可以修复它的一般解决方案是:

  • 删除* .dcp * .dcpil * .dcu * .dcuil * .bpl * .dll
  • 以其他方式重写代码
  • 使用编译器选项修补
  • 获取最新的Delphi版本

如果我关闭范围检查,我个人发现其中一个错误有待解决。如果你不使用其他单位的泛型,其他人就会解决。如果将单元名称和类名重命名为较小,则可以解决一个问题。

当然,您应该报告http://qc.codegear.com

上的任何问题

答案 2 :(得分:3)

以下步骤可能是更好的解决方案:
将数组声明为类型,并使用此类型定义类常量,例如

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;

这使得数组声明显式。

答案 3 :(得分:2)

我在这个问题上浪费了几个小时,删除了dcu等等无济于事。

最后,对我有用的是取消选中编译器选项中的溢出检查,重建项目,重新检查溢出检查,以及重新重建。瞧!问题已经消失。去搞清楚。 (仍在使用D7)。

答案 4 :(得分:1)

我有类似的情况,解决方法是从/ lib / debug中删除文件urlmon.dcu。

它也完全关闭了“使用debug .dcus”。这当然是不可取的,但是您可以使用它来检查问题是否与您自己的任何单位或任何delphi的单位有关。

答案 5 :(得分:1)

尝试清理“输出目录”,这样德尔福就无法对脏.DC进行精细处理,并且它被强制使用.PAS。 有时这有帮助。 如果您没有配置“输出目录”,请尝试删除(或更好地移动备份文件夹)所有.DCU文件。

答案 6 :(得分:1)

Delphi XE3 Update 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_的构造函数参数不可选。

答案 7 :(得分:0)

对我来说,在D2010中,禁用编译器选项“发送运行时类型信息”就可以了。

答案 8 :(得分:0)

禁用&#34;包括远程调试符号&#34;来自链接器选项修复了我的问题Delphi 2007,dll项目

答案 9 :(得分:0)

从各种答案中,此错误看起来是编译器的一般未处理异常。

我的问题是由于错误地调用function X(someString:String) : Boolean;来改变字符串并返回布尔值,使用someString := X(someString);

答案 10 :(得分:0)

正如我对内部错误的体验那样,我重新逐行编写并再次编译,并意识到某些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;

只是将条件改为示例。希望它有所帮助。

答案 11 :(得分:0)

我刚刚经历了类似的行为,导致内部错误LA30。 原因是新添加的字符串常量。 从改变后    const cLogFileName : string = 'logfilename.log';

到     const cLogFileName = 'logfilename.log';

(当然还有重新启动Delphi IDE),该错误不再显示。