[BUG] GlobalMultiUse クラスがマルチスレッド環境で終了しません。

文書翻訳 文書翻訳
文書番号: 300850 - 対象製品
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
すべて展開する | すべて折りたたむ

目次

現象

2 つのクライアント プロシージャを呼び出す ActiveX EXE のコンポーネント、同じ時刻でこのプロシージャ呼び出しの ActiveX ダイナミック リンク ライブラリ (DLL)、このクラスに別の ActiveX DLL、コンポーネントのまま ActiveX EXE の GlobalMultiUse クラス内のプロシージャをアクセスする場合は、MultiUse クラスの別のプロシージャが、メモリ内を処理が終了するも後にすべて失敗への参照にリリースされました。

この現象は、Visual Basic 6. 0 Service Pack 3 (SP3) またはそれ以前は発生しません。

原因

この問題は現在別のスレッドで呼び出さされている場合に、GlobalMultiUse DLL の DllCanUnloadNow 機能が FALSE に返すために発生します。 これは GlobalMultiUse DLL がマルチスレッド環境における自体を解放するできない可能性がありますをことを示します。

解決方法

サポートされている修正プログラムしますです、はのみことを目的としていますこの資料に記載されている問題を解決します。 この特定の問題が発生しているシステムにのみ適用します。

メモ この修正プログラムを入手する Visual Studio 使用許諾契約が必要です。

この問題を解決するには、Microsoft Product Support Services にお問い合わせのうえ、修正プログラムを入手してください。 Microsoft Product Support Services の電話番号一覧およびサポート料金については、次のマイクロソフト Web サイトを参照してください:
http://support.microsoft.com/contactus/?ws=support
メモ 特殊な場合は、Microsoft Support 担当者により、特定の更新は問題が解決される場合料金がサポート通常発生する可能性があります取り消されます。 通常のサポート料金が追加の質問および問題の特定のアップデートの対象とならない問題について適用されます。 ただし、これより新しい修正ファイルがリリースされている可能性もあります:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

状況

マイクロソフトをこのとして認識しています、Microsoft のバグこの資料の冒頭に記載されている製品です。

詳細

動作を再現する手順

GlobalMultiUse クラスで DLL を作成します。

  1. 既定のクラス、クラス 1 を使用して新しい ActiveX DLL プロジェクトを作成します。
  2. プロジェクト ] メニューの [ Project1 のプロパティ ] をクリックします。 プロジェクト名に GMultiUseDll 、変更し、 [OK] を実行します。
  3. プロパティ ] ダイアログには 6 - GlobalMultiUse に Class1 の Instancing プロパティを設定します。
  4. コピーして、次のコードをクラス 1 のコード モジュールに貼り付けます:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. GMultiUseDll.dll の作成 、プロジェクトをコンパイルする ファイル ] メニューの [クリックします。 GMultiUseDll.dll が作成されます。

MultiUse クラスで DLL を作成します。

  1. 既定のクラス、クラス 1 を使用して新しい ActiveX DLL プロジェクトを作成します。
  2. プロジェクト ] メニューの [ Project1 のプロパティ ] をクリックします。 プロジェクト名に MultiUseDll 、変更し、 [OK] を実行します。
  3. [ プロジェクト ] メニューの [ 参照設定 ] をクリックし、[ GMultiUseDll.dll ] </a0> チェック ボックスの [ OK] をクリック します。
  4. コピーして、次のコードをクラス 1 のコード モジュールに貼り付けます:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. MultiUseDll.dll の作成 、プロジェクトをコンパイルする ファイル ] メニューの [クリックします。 MultiUseDll.dll が作成されます。

ActiveX EXE プロジェクトの作成

  1. 既定のクラス、クラス 1 を使用して新しい ActiveX EXE プロジェクトを作成します。
  2. プロジェクト ] メニューの [ Project1 のプロパティ ] をクリックします。 プロジェクト名に TestServer 、変更し、 [OK] を実行します。
  3. [ プロジェクト ] メニューの [ 参照設定 ] をクリックし、[ MultiUseDll.dll ] </a0> チェック ボックスの [ OK] をクリック します。
  4. プロジェクト ] メニューの [ TestServer プロパティ ] をクリックします。 [ 全般 ] タブには、スレッド プールを 10 個のスレッドに設定します。
  5. コピーして、次のコード クラス 1 のコード モジュール
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. TextServer.exe の作成 、プロジェクトをコンパイルする ファイル ] メニューの [クリックします。 TextServer.exe が作成されます。

クライアント プロジェクトを作成します。

  1. Form1 のデフォルト フォームを使用して新しい標準 EXE プロジェクトを作成します。
  2. プロジェクト ] メニューの [ Project1 のプロパティ ] をクリックします。 プロジェクト名に TestClient 、変更し、 [OK] を実行します。
  3. Form1 に、ラベル (Label1) と、テキスト ボックス ([テキスト 1]) ([Command1] および [Command2]) の 2 つのコマンド ボタンを追加します。
  4. コピーして、次のコードを Form1 のコード モジュールに貼り付けます:
    Dim bStop As Boolean
    
    Private Sub Command1_Click()
        Dim oServer As Object
        Set oServer = CreateObject("TestServer.Class1")
        WaitTRUEinFile Text1.Text
        oServer.DoSomething
        Set oServer = Nothing
        Label1.Caption = "The reference was released"
    End Sub
    
    ' The purpose of this function is to synchronize the call to the
    ' GlobalMultiUse DLL through the file Sync.txt.
    Private Sub WaitTRUEinFile(sFile As String)
        Dim sFlag      As String
        Label1.Caption = "Waiting for 'TRUE' in " & sFile
        Do While bStop = False
            Open sFile For Input As #1
            Line Input #1, sFlag
            Close #1
            
            If UCase(Trim(sFlag)) = "TRUE" Then
                Exit Do
            End If
            DoEvents
        Loop
    End Sub
    
    Private Sub Command2_Click()
        bStop = True
    End Sub
    
    Private Sub Form_Load()
        Text1.Text = "c:\sync.txt"
        Command1.Caption = "Start"
        Command2.Caption = "Stop"
        bStop = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        bStop = True
    End Sub
    					
  5. TestClient.exe の作成 、プロジェクトをコンパイルする ファイル ] メニューの [クリックします。 TestClient.exe が作成されます。

テストを実行します。

  1. メモ帳を開きます。 最初の位置に文字"t"を追加し、C. ドライブのルートで Sync.txt としてのファイルを保存
  2. TestClient.exe の 2 つのインスタンスを開始します。 2 つの TestClient.exe プロセスがタスク マネージャーで実行していることを確認します。
  3. 開始 ] </a0> TestClient の両方のインスタンスをクリックします。
  4. Sync.txt を開きます。 true と、最初の行を変更し、保存します。

    ファイルを保存した後、TestServer.exe プロセス タスク マネージャーで確認します。
  5. TestClient の両方のインスタンスの 停止 をクリックし、フォームを閉じます。 されている TestClient.exe の実行中のインスタンスがないことがわかります。 この時点で、TestServer.exe は読み込まれたまま。
関連の問題の詳細についてはマルチスレッドに Visual Basic ではをクリックして資料以下「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
241896PRB: ActiveX コンポーネントの Visual Basic 6. 0 の問題のスレッド

プロパティ

文書番号: 300850 - 最終更新日: 2014年2月24日 - リビジョン: 4.2
この資料は以下の製品について記述したものです。
  • Microsoft Visual Studio 6.0 Service Pack 4
  • Microsoft Visual Studio 6.0 Service Pack 5
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 4
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5
  • Microsoft Visual Basic 6.0 Professional Edition
キーワード:?
kbnosurvey kbarchive kbbug kbqfe kblocalsvr kbpending kbmt KB300850 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:300850
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com