gpt4 book ai didi

delphi - XE6 ClientDataSet AV 尝试从 Firebird 加载数据

转载 作者:行者123 更新时间:2023-12-03 15:26:48 26 4
gpt4 key购买 nike

我有一个带有 FireDac FDConnection 和 FDSqlQuery 的简约项目,DataSetProvider 和 ClientDataSet,尝试访问示例我下载的Firebird 2.5包附带的Employee.FDB今天来自 SourceForge。

除了 FDConnection 弹出信息选项卡中的数据库名称和 FDQuery 的 Sql(设置为 select * from employee)外,所有内容都设置为默认值。 .

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 raised exception class $C0000005 with message 'access vioaltion at 0x0075d05b: read of address 0x00000000'.

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

第一次在运行时发生时,我弹出了某种“事件报告”窗口主动向内河码头报告此事。第一次见到。

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

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

最佳答案

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

首先,我尝试使用 MidasLib,应用程序运行良好,无需 q 所涉及的 AV。

因此,确信当前的 MidasLib 代码不会出现问题后,我去了回到尝试让应用程序与 Midas.Dll 一起工作。我检查了 Midas.DllXE6 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 数据库,所以罪魁祸首似乎是其中之一。

关于delphi - XE6 ClientDataSet AV 尝试从 Firebird 加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com