注意: GlobalMultiUse 類別不會終止在多執行緒環境中

文章翻譯 文章翻譯
文章編號: 300850 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

徵狀

當兩個用戶端呼叫程序的 ActiveX 執行檔在同一時間和此程序的元件會呼叫 MultiUse 類別 ActiveX 動態連結程式庫 (DLL),如果這個類別會存取另一個 ActiveX DLL 元件會停留在 ActiveX 執行檔中的一個 GlobalMultiUse] 類別中的程序中的另一個程序中的記憶體 ;、 處理序失敗終止,甚至畢竟在釋放其參考。

在 Visual Basic 6.0 Service Pack 3 (SP3) 或更早的版本中,不會發生這種行為。

發生的原因

之所以發生這個問題,是因為 DllCanUnloadNow 函式的 GlobalMultiUse DLL FALSE 傳回如果目前正在被另一個執行緒呼叫。這表示不可能能夠在多執行緒環境中釋放本身 GlobalMultiUse DLL。

解決方案

支援的 Hotfix 現在可以從 Microsoft,但只能用來修正本文所描述的問題。請只在發生此特定問題的系統上套用。

附註 您必須擁有以取得此 Hotfix 的 Visual Studio 授權合約。

如果要解決這個問題,洽詢 Microsoft 技術支援部以取得該 Hotfix。如需 Microsoft 產品支援服務電話號碼及支援成本的相關資訊的完整清單,請造訪下列 Microsoft 網站]:
http://support.microsoft.com/contactus/?ws=support
附註 在特殊情況下通常會因支援電話所產生的費用可能就不收取如果 Microsoft 支援人員認為某特定更新程式可以解決您的問題。平常的支援成本將會套用到其他支援問題是所做不限定特定有問題的更新程式。此修正程式的英文版應該具有下列檔案屬性或更新版本:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

狀況說明

Microsoft 已確認這是在 Microsoft 中的錯誤,會列在本文開頭的產品。

其他相關資訊

重製行為的步驟

建立具有 GlobalMultiUse 類別的 DLL

  1. 建立新的 ActiveX DLL 專案時使用預設類別類別 1。
  2. 從 [專案] 功能表中,按一下 [Project1 內容]。以 GMultiUseDll,變更專案名稱,然後按一下 [確定]
  3. 在 [屬性] 對話方塊將 [Instancing 屬性的類別 1] 設定為 6-GlobalMultiUse]。
  4. 複製並貼上下列程式碼,以 Class1 的程式碼模組:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. 從 [檔案] 功能表中,按一下 [製成 GMultiUseDll.dll 來編譯專案。建立 GMultiUseDll.dll。

建立具有 MultiUse 類別的 DLL

  1. 建立新的 ActiveX DLL 專案時使用預設類別類別 1。
  2. 從 [專案] 功能表中,按一下 [Project1 內容]。以 MultiUseDll,變更專案名稱,然後按一下 [確定]
  3. 從 [專案] 功能表按一下 [設定 引用項目、 選取 GMultiUseDll.dll] 核取方塊,然後按一下 [確定]。
  4. 複製並貼上下列程式碼,以 Class1 的程式碼模組:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. 從 [檔案] 功能表中,按一下 [製成 MultiUseDll.dll 來編譯專案。建立 MultiUseDll.dll。

建立 ActiveX EXE 專案

  1. 建立新的 ActiveX 執行檔專案時使用預設類別類別 1。
  2. 從 [專案] 功能表中,按一下 [Project1 內容]。以 TestServer,變更專案名稱,然後按一下 [確定]
  3. 從 [專案] 功能表按一下 [設定 引用項目、 選取 MultiUseDll.dll] 核取方塊,然後按一下 [確定]。
  4. 從 [專案] 功能表中,按一下 [TestServer 內容]。在 [一般] 索引標籤上設定 [以 10 個執行緒的 [執行緒集區]。
  5. 複製並貼上下列程式碼,以 Class1 的程式碼模組
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. 從 [檔案] 功能表中,按一下 [製成 TextServer.exe 來編譯專案。建立 TextServer.exe。

建立用戶端專案

  1. 建立新的標準 EXE 專案時的預設表單 Form1。
  2. 從 [專案] 功能表中,按一下 [Project1 內容]。以 TestClient,變更專案名稱,然後按一下 [確定]
  3. 將標籤 (Label1)、 文字方塊 (文字 1) 和兩個 CommandButtons (Command1 和 Command2) 新增到 Form1。
  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"新增到第一個位置,然後將檔案作為 Sync.txt 儲存根目錄中的磁碟機 C。
  2. 啟動 TestClient.exe 的兩個執行個體。請注意兩個 TestClient.exe 處理序正在執行工作管理員] 中。
  3. 這兩個執行個體的 TestClient,按一下 [開始]。
  4. 開啟 Sync.txt。變更為"true"的第一行,並儲存。

    儲存檔案之後請注意 TestServer.exe 程序在 [工作管理員]。
  5. 按一下 [停止] 這兩個執行個體的 TestClient,並關閉表單。不注意 TestClient.exe 執行的任何實例。這個時候 TestServer.exe 保持載入的。
如需相關問題的詳細資訊] 以多執行緒處理在 Visual Basic 中按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
241896PRB: 執行緒 Visual Basic 6.0 ActiveX 元件的問題

屬性

文章編號: 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 kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:300850
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

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