BUG: Класс GlobalMultiUse не завершить в многопотоковой среде

Переводы статьи Переводы статьи
Код статьи: 300850 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Развернуть все | Свернуть все

В этой статье

Проблема

Если два клиента вызов процедуры элемента ActiveX EXE-файла компонента, в то же время и эта процедура вызывает другую процедуру MultiUse класса ActiveX библиотеки динамической компоновки (DLL), если этот класс осуществляет доступ к процедуре в классе GlobalMultiUse в другую ActiveX DLL, исполняемые файлы ActiveX, компонент останется в памяти; т.е., процесс не смог завершить работу, даже после того как все ссылки на него были выпущены.

Данная проблема не возникает в Visual Basic 6.0 с пакетом обновления 3 (SP3) или более ранней версии.

Причина

Эта проблема возникает из-заDllCanUnloadNowфункции библиотеки DLL, GlobalMultiUse возвращает FALSE, если он в данный момент, вызывается другим потоком. Это означает, что GlobalMultiUse DLL не удается освободить себя в многопоточной среде.

Решение

Корпорация Майкрософт выпустила исправление, предназначенное только для устранения описанной в статье проблемы.. Предлагаемое исправление должно применяться исключительно в системах, где наблюдается описанная проблема..

Примечание.Необходимо иметь лицензионного соглашения Visual Studio для получения этого исправления.

Чтобы получить исправление и устранить проблему, свяжитесь со службами поддержки Майкрософт.. Полный список телефонов службы поддержки корпорации Майкрософт, а также сведения об условиях обслуживания см. на веб-узле Майкрософт по следующему адресу::
http://support.microsoft.com/contactus/?ws=support
Примечание.В отдельных случаях, если специалистом службы технической поддержки Майкрософт будет определено, что решением проблемы является специально выпущенное исправление, оплата, предусмотренная за обращение в службы технической поддержки, может быть отменена.. Дополнительные услуги по технической поддержке, не связанные с данным исправлением, оплачиваются на стандартных условиях..Английская версия данного исправления содержит версии файлов, приведенные в следующей таблице или более поздние.:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

Статус

Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в начале данной статьи..

Дополнительная информация

Действия по воспроизведению поведения

Создание библиотеки DLL с помощью класса GlobalMultiUse

  1. Создайте новый проект Библиотеки ActiveX с помощью класса по умолчанию класса Class1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляGMultiUseDllи выберите командуOk..
  3. В диалоговом окнеСвойствадиалоговое окно поле, задайте свойство Instancing класса Class1 на6 GlobalMultiUse.
  4. Скопируйте и вставьте следующий код в модуль кода для класса Class1:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. ИзФайл:выберите пунктСделать GMultiUseDll.dllЧтобы скомпилировать проект. Создается GMultiUseDll.dll.

Создание библиотеки DLL с MultiUse классов

  1. Создайте новый проект Библиотеки ActiveX с помощью класса по умолчанию класса Class1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляMultiUseDllи выберите командуOk..
  3. ИзProjectвыберите пунктСсылки, выберитеGMultiUseDll.dllи нажмите кнопкуOk..
  4. Скопируйте и вставьте следующий код в модуль кода для класса Class1:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. ИзФайл:выберите пунктСделать MultiUseDll.dllЧтобы скомпилировать проект. Создается MultiUseDll.dll.

Создание проекта ActiveX EXE-файла

  1. Создайте новый проект ActiveX EXE с помощью класса по умолчанию класса Class1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляTestServerи выберите командуOk..
  3. ИзProjectвыберите пунктСсылки, выберитеMultiUseDll.dllи нажмите кнопкуOk..
  4. ИзProjectвыберите пунктСвойства 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. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляTestClientи выберите командуOk..
  3. Добавьте в форму Form1 (Label1) Label, TextBox (Текст1) и два CommandButtons (Command1 и Command2).
  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. затем –START ::для обоих экземпляров TestClient.
  4. Откройте Sync.txt. Изменить первую строку "true" и сохранить.

    После сохранения файла, обратите внимание, TestServer.exe процесса в диспетчере задач.
  5. затем –Сообщение об ошибке «Stop:для обоих экземпляров TestClient и закрытия формы. Обратите внимание на то нет экземпляров TestClient.exe работы. В данный момент TestServer.exe остается загрузки.
За дополнительной информацией о проблемах, связанных с многопоточностью в Visual Basic, щелкните следующий номер статьи базы знаний Майкрософт:
241896Проблема: Threading проблемы с компонентами ActiveX Visual Basic 6.0

Свойства

Код статьи: 300850 - Последний отзыв: 21 февраля 2014 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic 6.0 Professional Edition
Ключевые слова: 
kbnosurvey kbarchive kbbug kblocalsvr kbpending kbqfe kbmt KB300850 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:300850

Отправить отзыв

 

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