0

ソフトウェアスイートをODACv5からv8.2.8にアップグレードすることに興味があります。

特に1つのアプリが問題を引き起こしています。このアプリケーションは、dllとして実装された一連のセカンダリアプリケーションの1つをロードします。

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)を受信して​​います。TFieldDescMemDS.CreateFieldDefs()

私は困惑しています。一方の呼び出しメソッドが正常に機能し(ランチャーアプリ)、もう一方の呼び出しメソッド(dll)が常に失敗するのはどうしてですか?

誰かがこの分野で困難を経験したことがあれば、私はどんな情報でもいただければ幸いです、しかしそれは希薄に聞こえるかもしれません

4

2 に答える 2

1

この問題はすでに修正されています。最新のODACバージョン8.6.12をダウンロードするか、Assertを呼び出す行を変更できます。

TCustomDADataSet.GetFieldTypeメソッドで

replace 
  Assert(FieldDesc is TCRFieldDesc);
with
  Assert(IsClass(FieldDesc, TCRFieldDesc));
于 2013-03-21T09:27:09.540 に答える
1

DEVARTMySQLおよびSQLコネクタを使用します。MySQL(MyDAC)接続で正確な問題が発生しました。しかし、私が見つけたのは次のとおりです。DBAccess.pasファイルでは、上記のコード変更はすでに存在していました。

Assert(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;
于 2013-10-03T13:12:47.680 に答える