18

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

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

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

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

[帕斯卡致命错误] F2084 内部错误:LA33

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

目前,我已经删除了对这个包的 bpl/dcp 文件的所有引用,但仍然得到同样的错误......

使用 BDS2006(德尔福)

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

4

12 回答 12

15

我按照以下步骤设法解决了这个问题

  1. 创建一个新包
  2. 一个一个地,将组件添加到包中,编译安装,直到失败。
  3. 调查导致故障的单元。

事实证明,有问题的单元有一个类常量数组,例如

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

于 2008-10-01T08:46:57.223 回答
4

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

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

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

如果我关闭 Range Checking,我个人发现其中一个需要解决的错误。如果您不使用另一个单元的泛型,其他问题就解决了。如果将单元名称和类名称重命名为更小,则可以解决一个问题。

当然,您应该在http://qc.codegear.com上报告您遇到的任何问题

于 2008-09-30T14:59:33.140 回答
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;

这使得数组声明显式。

于 2011-01-19T11:13:34.907 回答
2

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

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

于 2011-03-30T20:56:25.913 回答
1

我有一个类似的案例,解决方案是从 /lib/debug 中删除文件 urlmon.dcu。

它还可以完全关闭“使用调试 .dcus”。这当然是不可取的,但是您可以使用它来检查问题是否出在您自己的任何单位或任何 delphi 的单位上。

于 2010-09-13T09:59:20.707 回答
1

尝试清理“输出目录”,这样 Delphi 就不能处理脏的 .DCU,它会被迫对 .PAS 进行处理。有时这会有所帮助。如果您没有配置“输出目录”,请尝试删除(或更好地移动到备份文件夹中)所有 .DCU 文件。

于 2014-01-13T13:38:57.880 回答
1

从链接器选​​项中禁用“包含远程调试符号”为我解决了 Delphi 2007,dll 项目的问题

于 2014-03-19T15:40:16.203 回答
1

德尔福 XE3 更新 2

F2084 内部错误:URW1147

情况1:

问题是在泛型类的过程中声明了一个类型。

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

将类型声明移动到类声明的私有部分解决了这个问题。

案例二:

这种情况下的问题与可选参数有关:

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_为非可选。

于 2014-07-24T11:43:36.523 回答
0

对我来说,在 D2010 中禁用编译器选项“Emit runtime type information”就可以了。

于 2013-01-22T14:11:33.800 回答
0

从各种答案来看,这个错误看起来是编译器的通用未处理异常。

我的问题是由错误调用引起的,function X(someString:String) : Boolean;它改变了字符串并返回了一个布尔值,使用someString := X(someString);

于 2014-11-28T05:30:48.803 回答
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;

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

于 2016-05-04T07:53:03.837 回答
0

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

const cLogFileName = 'logfilename.log';

(当然还有重新启动 Delphi IDE)错误不再出现。

于 2018-09-20T07:57:03.680 回答