0

私たちのプログラムでは、Webサービスを使用して、サードパーティからプログラムにデータをプルバックしています。

Delphi2009からDelphiXEに更新して以来、Windows Server 2003ユーザーは、WebサービスへのSOAP呼び出しを行うときに、次のエラーメッセージを受け取ります。

ここに画像の説明を入力してください

Server 2003のmsvcrt.dllには、何らかの理由で現在呼び出されているプロシージャ_ftol2_sseがありません。

これらのビルドを実行しているときにWindowsServer2003でこのエラーが発生しないため、Delphi2009でソースコードを使用しているときにこのプロシージャが呼び出されていなかったことはわかっています。

これは実行可能ですか?IDEの変更は、呼び出されているdllプロシージャに影響しますか?このエラーを追跡または修正する方法について、誰かが洞察やアイデアを持っていますか?

ありがとう

4

1 に答える 1

2

これは、このトピックに関してあなたが尋ねた3番目の同様の質問です。私はあなたにいくつかの背景情報を提供し、あなたが何が起こっているのかを理解するのを手伝うことを試みます。

まず第一に、msvcrt.dllがシステムコンポーネントであることを知ることが重要です。これはMSVCランタイムではありません。Windowsの一部として提供されます。古き良き時代、90年代半ばには、多くの開発者がMSVC6ランタイムが常に利用可能であると想定していました。そして、彼らはプログラムのインストールの一部としてそのランタイムをインストールすることを怠りました。これにより、インストールプログラムがMSVC6のないマシンを見つけたときに問題が発生することがありました。

MSVCチームは、別の名前のランタイムDLL、msvcrt70.dll、msvcrt80.dllなどに移動しました。また、MSVCランタイムのインストールは、すべてのMSVCアプリケーションのインストールプログラムの一部である必要があることを開発者に教育しました。

しかし、Windowsチームは、MSVC6ランタイムが利用可能であると想定したインストーラーを備えたレガシーアプリを支援したいと考えていました。そこで彼らはMSVC6ランタイムを自分たちの管理下に置き、Windowsと一緒に出荷し始めました。これは、Windows2000またはXPの頃に始まったと思います。

私が言いたいのは、msvcrt.dllはシステムDLLであり、制御できないということです。以前の質問では、そのDLLを変更する試みについて説明しました。そうしないでください。

さて、私が収集できることから、2003サーバーに付属しているバージョンのmsvcrt.dllは、という名前の関数をエクスポートしません_ftol2_sse。SSE浮動小数点は、2003サーバーの時代には広く利用できなかったため、驚くことではありません。明らかに、システム内の何かがインポートの試みを引き起こしています_ftol2_sse

Dependency Walkerを使用すると、これを引き起こしている原因を突き止めることができるはずです。[プロファイル]メニューの機能を使用して、アプリケーションを起動し、ログを詳しく調べます。にリンクしようとする一連のイベントを確認できるはずです_ftol2_sse

msvcrt.dllにリンクされているWindowsコードがあるとしたら驚きます。そのライブラリは、MSVC6に対してリンクするレガシーアプリの小道具として純粋に提供されています。しかし、あなたは決して知りません。

また、実行可能ファイルをDependencyWalkerにロードしてみてください。インポートされたDLLのリストを見てください。msvcrt.dllがリストに含まれているかどうかを確認してください。もしそうなら、実行可能ファイルがインポートする機能と、そのリストにあるかどうかを確認してください_ftol2_sse。もしそうなら、Delphiのソースコードのどこかにそれを見つけることができるでしょう。

ウェブ上のさまざまな同様の報告から、あなたが直面している問題は良性であると思われます。同じ問題を報告している人の多くは、ダイアログをOKにして、プログラムを問題なく続行させることができます。これは、エラーレポートを単純に抑制して、問題を解決できることを示しています。SetErrorModeこれを行うには、関数を使用します。SEM_FAILCRITICALERRORSフラグを含めたい。

SetErrorModeかなりひねくれたインターフェースを持っていることに注意してください。私が今まで見たほとんどすべてのコードはそれを間違って使用しています。Delphi RTLのコード、および一般的に使用されるDelphiサードパーティライブラリの多くを含みます。レイモンド・チェンは、いつものように、それを正しく使用する方法を説明します

コンパイラを切り替えると、動作が変化する可能性がありますか?確かに彼らはできた。使用しているライブラリコードの実装が異なります。あるいは、決定的な瞬間にエラーモードがどういうわけか異なっているのかもしれません。

于 2012-10-16T20:14:10.517 に答える