0

VB6 で記述された ActiveX DLL が C++ DLL を呼び出しているプロジェクトがあります。ActiveX DLL は、ASP の「CreateObject」呼び出しを介して IIS 7 から読み込まれます。

Web ユーザーが 1 人だけサイトにアクセスしている場合は、すべてが完全に機能します (何千回もの繰り返しでテストされています)。2 人以上の同時ユーザーがサイトにアクセスするとすぐに、1 つ以上のユーザー セッションがクラッシュします (多くの場合、500 エラーで)?

これは、C++ DLL が適切にスレッドセーフではないことが原因ではないかと考えたので、グローバル ミューテックスを使用してアクセスを制限するように書き直しました。これは効果がありませんでした。

正直に言うと、VB6 ActiveX DLL の各インスタンスはシングルスレッド アパートメントで実行されるため、これは問題にならないと思っていたのでしょうか?

ここで何が起こっているのか、誰かに光を当てることができますか? IIS が VB6 ActiveX DLL の複数のインスタンスをロードしたときに何が起こるか、正確には理解していないようです。

4

1 に答える 1

0

ActiveX DLLは、シングルスレッドモデルまたはシングルスレッドアパートメントモデルの場合があります。 シングルスレッド

アパートスレッド

ActiveX DLLを作成しましたか?そのスレッドモデルを決定できますか?

また、デバッグを有効にして、Visual Studioでエラーをキャッチできるかどうかを確認することもできます:http://www.falconwebtech.com/post/2010/12/28/Debugging-Classic-ASP-in-IIS7-and -VS2010.aspx

デバッグが有効になっている場合、ASPはシングルスレッド方式で一度に1つのリクエストを処理するように制限されます。したがって、デバッグ中にエラーが発生しない場合、ActiveX DLLは、アパートメントスレッドではなく、シングルスレッドである可能性があります。

また、 AspExecuteInMTAの設定について知っていますか?意図せずにtrueに設定されていないことを確認することをお勧めします。

于 2013-03-07T15:45:47.230 に答える