2011-01-10 3 views
2

D2007アプリケーションでは、THTTPRIOオブジェクトでアクセスされるWebサービスを使用しています。 THTTPRIOオブジェクトを含むTDatamoduleが破棄されると、アクセス違反が発生します。OpToSoapDomComv.TRefCache.FNodesには存在しないXMLNodesへの参照が含まれています

TSoapDOMConvertが解放されたときに、このAVは順番に実行され、発生します

destructor TRefCache.Destroy; 
begin 
    FHREFs.Free; 
    FMHREFs.Free; 
    FNodes := nil; //Causes AV 
end; 

FNodesを呼び出す

TRefCache(RefMap[0].Instance).Free 

はIXMLNodesへの一つの基準を含むTInterfaceListですが、オブジェクトが持っているようですこれの前に解放された。

誰でもこの問題を知っていますか?どのようにそれを解決するには? RIOオブジェクト THTTPRIOオブジェクトの使用に関する

[編集]詳細情報は、Webサービスへの次の呼び出しでのみ使用されます。

LIResult.Assign((Rio as IWSLicenseIntf).CheckLicense(FLicenseInfo)); 

LIResultオブジェクトは、後に解放されます。

答えて

2

THTTPRIOには、2つのライフタイム管理スキームがあります。コンポーネントとして1つ、インターフェイスとして1つ。それらを混ぜることは悪い考えです。これはあなたの問題かもしれません。

Jean-Marie Babetがコメントしました。 http://www.delphigroups.info/2/11/344722.html

WSDLから生成されるソースファイルには、GetIWSLicenseIntf(または同様のもの)と呼ばれる機能が必要です。 Rioコンポーネントの代わりにそのコンポーネントを使用してみてください。 (Rio as IWSLicenseIntf)GetIWSLicenseIntf()に変更し、必要に応じてパラメータUseWSDLとURLを追加します。

別のオプションは、あなたが無料ではないWSLicなく自由RIOをする必要がありますので、参照がカウントされ、Delphiでこの

var 
    WSLic: IWSLicenseIntf; 
    RIO: THTTPRIO; 
begin 
    RIO := THTTPRIO.Create(nil); 
    RIO.URL := 'www.whatever.com'; 
    WSLic := RIO as IWSLicenseIntf; 
    LIResult.Assign((WSLic).CheckLicense(FLicenseInfo)); 
end; 

インタフェースのようなものになるだろう。 WSLicが範囲外になると、あなたのために解放されます。 私はあなたのコードを持っていないので、コードはもちろんテストされていません。

+0

"THTTPRIO.Create(nil)"と "FreeAndNil(RIO)"を使ってTHTTPRIOコンポーネントを手動で作成して解放しようとしましたが、それでも同じAVを取得します。私はここで最初の投稿を編集して、RIOオブジェクトの使い方をより詳しく表示しました。 – Bascy

+0

@Micke - コメントを投稿するにはちょっとコメントしてください。 – Bascy

+0

@Bascy編集の回答 –

関連する問題