我有兴趣将一套软件从ODAC v5升级到v8.2.8。
特别是一个应用程序会导致问题。此应用程序加载一组作为dll实现的辅助应用程序之一。
LibHandle := LoadLibrary(PChar(dllname));
if LibHandle <> 0 then
begin
@showForm := GetProcAddress(LibHandle,'ShowMainDllForm');
if (@showForm <> nil) then
begin
try
ShowForm(Application.Handle, @FGlobalVars, 1);
启动器很好 - 它有自己的数据库连接,我可以非常愉快地浏览各种ODAC单元。
但是,dll会在尝试打开游标时立即排除。错误是单位DBAccess.pas
中的断言失败,从MemDs.pas
调用。我已经逐步完成了这一点,并证明断言失败是正确的; Assert(FieldDesc is TCRFieldDesc)
正在从TFieldDesc
收到MemDS.CreateFieldDefs()
。
我很难过。怎么可能一个调用方法工作正常(启动器应用程序)而另一个(dll)总是失败?
如果有人在这方面遇到困难,我会很感激任何信息,不管听起来多么微不足道
答案 0 :(得分:1)
我们已经解决了这个问题。您可以下载最新的ODAC版本8.6.12或修改调用Assert的行:
TCustomDADataSet.GetFieldType方法中的
replace
Assert(FieldDesc is TCRFieldDesc);
with
Assert(IsClass(FieldDesc, TCRFieldDesc));
答案 1 :(得分:1)
我们使用DEVART MySQL和SQL连接器。我遇到了MySQL(MyDAC)连接的确切问题。但是,我发现的是: 在DBAccess.pas文件中,上面的代码更改已经存在;
断言(IsClass(FieldDesc,TCRFieldDesc));
但我仍然得到相同的断言错误。我进一步介入,在CRFunctions单元中找到了,我进行了以下更改,现在我的服务器连接完全可以从dll文件中运行:
begin
if IsLibrary then
Result := IsClassByName(Obj, AClass)
else
//------------------------------------
// Danny MacNevin : October 3,2013
// commented out the below line to fix an Assertion Error
// using the TMyConnection in a dll file.
// It was being called from the DBAccess.pas file at line: 7251
// To put this file back to normal, remove the line I added, and
// uncomment the line below...
//------------------------------------
//Result := Obj is AClass;
Result := IsClassByName(Obj, AClass) //Line replaced by Danny
end;