3

Delphi 2009 では、Oracle への接続 (OCI.dll 経由) と Web サービス メソッドの呼び出しの両方を実行すると、IDE でアプリケーションを閉じるときに ntdll.dll で例外が発生することがわかりました。

Oracle への接続には、DOA (Direct Oracle Access) 4.1.1.0 と ODAC コンポーネント (最新の試用版) の両方を使用してみました。

Web サービス メソッド呼び出し (単純な「関数 HelloWorld: 文字列」) では、Web サービスから WSDL をインポートした後、Delphi ストック機能を使用しています。

OCI.dll を使用しない「ダイレクト」モードで ODAC コンポーネントを使用すると、終了時に例外は発生しません。

(Oracle に接続せずに) Web サービス メソッドのみを呼び出した場合、終了時に例外は発生しません (DOA または ODAC コンポーネントを使用しても)。

(OCI.dll 経由で) Oracle にのみ (Web サービス メソッドを呼び出さずに) 接続すると、すべてがうまくいきます (DOA または ODAC コンポーネントのどちらを使用しても)。

Delphi 7 と Delphi XE2 の両方で実行すると、まったく同じコードが完全に実行されます。アプリケーションを閉じても例外は発生しません。

いくつかの情報: Delphi 2009 (ストックおよび Update 3 バージョン) OS: Windows 7 32 ビット Oracle Instant Client 10.2.0.4 および Oracle Instant Client 10.2.0.5

アプリケーションを閉じる際の Delphi 2009 のヒープ破損に関連する問題ではないかと疑い始めました...

何か助けてください。

再現手順 (コメントから):

  1. 新しい VCL フォーム アプリケーションを作成する
  2. TOracleSession DOA コンポーネント (OracleSession1 という名前) をフォームに配置します。
  3. フォームに TButton を配置します (Button1 という名前)。
  4. ボタン クリック イベント用に次のイベント ハンドラーを配置します。

コードは次のとおりです。

procedure TForm1.Button1Click(Sender: TObject);
var
   MyWebService3Soap: WebService3Soap;
   s: string;
begin
   OracleSession1.LogonDatabase := 'SomeLogonDB';
   OracleSession1.LogonUsername := 'SomeUsername';
   OracleSession1.LogonPassword := 'SomePassword';
   OracleSession1.Connected := True;
   ShowMessage('Connected');

   MyWebService3Soap := GetWebService3Soap();
   s := MyWebService3Soap.HelloWorld(); // Just returns a string such as "Hello World"
   ShowMessage(s);
 end;

「WebService3Soap」インターフェースは、Delphi 2009 WSDL Importer によって自動的に生成されるインターフェースです。意味のある部分は次のとおりです。

WebService3Soap = interface(IInvokable)
  ['{F6F12FA6-3881-8BB5-AD71-2408B47692CD}']
    function  HelloWorld: string; stdcall;
  end;

function GetWebService3Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): WebService3Soap;

initialization
  InvRegistry.RegisterInterface(TypeInfo(WebService3Soap), 'http://mytest.it/Test3', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WebService3Soap), 'http://mytest.it/Test3/HelloWorld');
  InvRegistry.RegisterInvokeOptions(TypeInfo(WebService3Soap), ioDocument);
end.

IDE 内でアプリケーションを実行し、ボタンを押して (次の 2 つの ShowMessages を閉じます)、フォームを閉じます。

4

1 に答える 1

2

それが「DLL地獄」の問題であるかもしれないというヒントを与えられて、私はWindowsXPとVistaの両方でテストを実行することができました:すべてがうまくいきました。そのため、この問題はWindows7上のDelphi2009に何らかの形で関連していると思い始めました。

私は正しかったのですが、Delphi 2009には、Windows7でのデバッグに問題があることがわかりました。

幸いなことに、パッチが利用可能です。

ID:27476、Delphi2009およびC++Builder2009の修正プログラム2

パッチの適用は解決しました!

于 2012-10-30T07:18:04.667 に答える