一部の Windows 2003 サーバー上の Delphi アプリケーションで問題が発生しています。Web サービス呼び出しを使用して別のサーバーに接続し、データを送受信します。アプリが Authenticate メソッドに到達するとすぐに、アプリは終了します。このアプリは、Win Server 2003 を搭載した以前のボックスでは何年も機能していましたが、新しく構築されたマシンでは機能しません。マシンはほとんど同じようにセットアップされていますが、追跡できない構成設定が明らかに異なっています。また、Authenticate の呼び出しでエラーが明らかになりますが、パケット スニッフィングは、アプリとアプリが接続しようとしているサーバーとの間で何も起こらないことを証明しています。ローカルでエラーを複製することはできないので、できます。デバッガーでアプリをステップ実行することもできません。Indy 9 Delphi Web 接続がサイレントに失敗する理由について何か考えはありますか?
2 に答える
爆破したのはこちら:
MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);
...
if MySoapObject <> nil then
MySoapObject.SomeFunction(); // BOOM! Access Violation here.
解決策が見つかりました!DEP(データ実行防止)であることが判明しました。Delphi2007 の SOAP ライブラリを使用してコードを再構築したところ、問題は解消されました。私はそれをしたくありませんでした (デシリアライゼーションは XML でサーバーを停止させる問題を引き起こしました)、そして私のマネージャーは本当にそれをしたくありませんでした (大規模な回帰テストを含む)、私は SOAP の違いを探しました。 D2005 と D2007 の間のソース コードであり、2 つの間の相違点に的を絞った変更を加えることを目的としています。つまり、違いを生む違いを見つけます。 Beyond Compareはここでの私の相棒でした。奇妙に際立っていた変更の 1 つは、RIO.PAS に新しいユニット PrivateHeap.pas が含まれるようになったことです。なぜだろうとググってみると、的を射ているような説明で同様の問題が見つかりました。
DEPの問題は基本的に、Windows XP Service Pack 2 以降では、ハードウェアが対応している場合、Windows は非実行可能メモリからのコードの実行を防止します。残念ながら、Delphi SOAP ランタイムは一連のサンクを作成し、これらに割り当てられたメモリは実行可能としてマークされませんでした。したがって、対応するハードウェアで OS の更新がリリースされた場合、RIO コンポーネントによってサポートされるメソッドを呼び出すと、AV が発生します。この問題は、PrivateHeap ユニットのアップデートで解決されました。
-- ジャン=マリー・バベ
http://delphigroups.info/2/11/344230.html
ビンゴ!ここが難しいところです。サーバーでは常に DEP が有効になっています。そのため、最初は、これは可能性が低いように思われました。しかし、DEP は扱いが難しく、新しいハードウェアは古いハードウェアよりも優れています。過去には DEP の問題を回避できたと思いますが、現在は新しいハードウェアが私たちをつまずかせています。サーバー管理者が DEP 保護をオフにして (サードパーティ アプリの場合)、再起動すると、古いコードが機能しました。最終的には新しいライブラリに移行しますが、これは、他の方法では問題なく動作するこのアプリを回帰テストする必要がなくなるため、短期的な修正としては優れています。
要約すると、データ実行防止 (DEP) が HTTPRIO オブジェクトの作成を妨害したため、新しく構築された Windows2003 サーバーで Delphi2005 アプリがクラッシュしていました。RIO は例外なく作成され、有効に見えました。しかし、関連付けられた IInvokable オブジェクトが使用されると、ネットワーク上で通信を試みる前に、アクセス違反がスローされます。協力的で非常に忍耐強い管理者、開発仲間の Mcmar、Beyond Compare、Jean-Marie Babet に敬意を表します。
2003 で問題を引き起こしているのはファイアウォールでしょうか?