XE6 ClientDataSet AV尝试从Firebird加载数据

时间:2014-08-05 19:31:50

标签: delphi firebird2.5 tclientdataset

我有一个FireDac FDConnection& amp;的极简主义项目。 FDSqlQuery, DataSetProvider和ClientDataSet,试图访问该示例 我下载的Firebird 2.5软件包附带的Employee.FDB 来自SourceForge今天。

除了FDConnection弹出的“信息”选项卡中的数据库名称和设置为select * from employee的FDQuery的Sql之外,所有内容都设置为默认值,因为它们与调色板相同。

FDQuery打开正常,但是一试一试 要在IDE或运行我的应用程序中打开CDS,我会收到访问冲突。

这是我的全部代码:

  FDQuery1.Open;
  Caption := IntToStr(FDQuery1.RecordCount);  // this shows 42 on the form's caption
  CDS1.Open;  // AV here

因此,FDQuery打开正常,但CDS没有。

在运行时,此处发生异常:

  function TCustomClientDataSet.CreateDSBase: IDSBase;
  begin
    CreateDbClientObject(CLSID_DSBase, IDSBase, Result);
    Check(Result.SetProp(dspropANSICODEPAGE, DefaultSystemCodePage)); <-- Exception here
    Check(Result.SetProp(dspropUTF8METADATA, NativeUInt(True)));
    Check(Result.SetProp(dspropUTF8ERRORMSG, NativeUInt(True)));
  end;

例外消息是

  

Project FBTest1引发异常类$ C0000005 with   消息'访问违规位于0x0075d05b:读取地址0x00000000'。

在IDE中,如果我尝试在CDS上设置Active = True,我会收到类似的异常, 该消息称发生在DSnap200.Bpl。

第一次发生在运行时我有一些“事件报告”弹出窗口 提议向Embarcadero报告。我第一次见到这一点。

如果我用SqlConnection和SqlQuery替换FDac组件,我得到了 同样的错误。

所以,我想我的问题是,CDS可以简单地通过使用像这个一样简单的项目的默认属性设置来激发这种行为,即我是否错过了一个步骤,或者它是否可能是EMBA QC的事情?

1 个答案:

答案 0 :(得分:4)

解决!感谢Graymatter建议尝试使用MidasLib,我得到了 到问题的底部并修复它,以便应用程序现在可以使用Midas.Dll。我发布这个作为答案,而不是评论,首先是因为它有点太长了,但是,更重要的是,原因实际上相当奇怪,解决方案可能会帮助其他遇到问题的人。

首先,我尝试使用MidasLib,应用程序运行正常,没有q所涉及的AV。

所以,我保证当前的MidasLib代码不会出现问题 回到试图让应用程序与Midas.Dll一起工作。我检查了Midas.Dll XE6 bin目录和\ Windows \ SysWOW64中的版本,它们都和我一样 期待,2014年6月16日20.0.16277.1276。

在DataSnap.DSIntf中跟踪CheckDBlient并仔细观察,一分钱 放弃了,我意识到发生了什么:

procedure CheckDbClient(const CLSID: TGUID);
[...]
begin
  [...]
      if DbClientHandle = 0 then
      begin
        Size := 256;
        SetLength(FileName, Size);
        if RegQueryValue(HKEY_CLASSES_ROOT, PChar(Format('CLSID\%s\InProcServer32',
          [GUIDToString(CLSID)])), PChar(FileName), Size) = ERROR_SUCCESS then
          SetLength(FileName, Size) else
        begin
        [...]
        end;
        DbClientHandle := LoadLibrary(PChar(FileName));

这将从注册中的InProcServer密钥获取Midas.Dll的路径,并且这样 没有指向XE6的bin目录或SysWOW64,而是指向另一个没有的位置 我的创作,其中包含一个可追溯到2007年的Midas.Dll版本。奇怪的是,与D7时代的Dll版本不同,这个Dll在其属性页面上没有版本信息,但它的创建日期为2002年8月9日,文件大小为351Kb。

所以,一旦我找到了,修复问题就像重命名Dll一样简单 操作系统不会加载它,并在SysWOW64中重新注册版本。

流氓Midas.Dll来自哪里尚不清楚,但它确实到了 上周,因为我不是在上周四晚上的备用。

此后我安装的唯一内容是少数第三方GUI实用程序 管理/访问Access,IB和Firebird数据库,所以罪魁祸首似乎已经存在 其中之一。