Problemy dotyczące składników programu Visual Basic 6.0 ActiveX wątków

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 241896 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Symptomy

Korzystanie ze składników języka Visual Basic 6.0 ActiveX w środowisku wielowątkowych, powinny być znane następujące potencjalne problemy:

Biblioteka DLL ActiveX obsługiwanej w wielowątkowych klienta

  • Wewnątrz MSVBVM60 naruszenie zasad dostępu.BIBLIOTEKA DLL.
  • Klient przejdzie w stan zakleszczenia.
Te dwa symptomy, jeśli biblioteka DLL ActiveX języka Visual Basic jest obsługiwana w środowisku wielowątkowych, na przykład, IIS, MTS lub wielowątkowych klienta mogą być widoczne i Zachować w pamięci opcja nie jest włączona. Aby włączyć tę opcję, wykonaj następujące kroki:
  1. Z Projekt menu wybierz Właściwości projektu.
  2. Na Ogólne Karta, upewnij się, że Model wątków jest wątki w apartamencie, a następnie wybierz Wykonanie instalacji nienadzorowanej i Zachować w pamięci pola wyboru*.
  3. Zapisz projekt i kompilowanie pliku DLL.
* Uwaga W Wykonanie instalacji nienadzorowanej opcja jest niedostępna, jeśli projekt zawiera wszystkie elementy interfejsu użytkownika, takie jak formularze lub formantów. W Zachować w pamięci opcja jest niedostępna, jeśli Wykonanie instalacji nienadzorowanej nie jest zaznaczone.

Uwaga Przed do dodatku Service Pack 3 dla programu Visual Studio 6.0 było możliwe uzyskanie AV podczas zamykania procesu z Przechowuj w pamięci włączone. Ten problem został naprawiony w najnowszy dodatek service pack dla programu Visual Studio 6.0:
http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx "

Jeśli ActiveX DLL lub UserControl projekt zawiera deklaracje API, zakleszczenia mogą wystąpić podczas zamykania procesu/wątku lub obiektu tworzenia, nawet jeżeli Wykonanie instalacji nienadzorowanej pole wyboru zostało zaznaczone w odniesieniu do ActiveX DLL.W celu obejścia tego problemu można użyć biblioteki typów zamiast Declare w języku Visual Basic. Aby uzyskać dodatkowe informacje na temat korzystania z biblioteki typów kliknij numer artykułu poniżej 2% w celu wyświetlenia artykułu %2 z bazy wiedzy Microsoft Knowledge Base:
189133 UPLOAD: Ułatwiają dostęp do VB z biblioteki typów C DLL

EXE formantu ActiveX dostępny przez klienta wielowątkowych lub wielu threaded jednego lub wielu klientów

Błąd wykonania "7": za mało pamięci, a czasem również następuje błąd operacji na dysku.
Błąd wykonania "430": klasa nie obsługuje automatyzacji lub nie obsługuje oczekiwanego interfejsu.
Błąd wykonania "424": wymagany obiekt.
Błąd wykonania "-2147023170 (800706be)": Błąd automatyzacji. Zdalne wywołanie procedury nie powiodło się.
Błąd wykonania "-2147287010 (8003001e)": Błąd automatyzacji. Jest to "Wystąpił błąd dysku podczas operacji odczytu." oparty na ErrLook.
Dodatkowy serwer procesów (ThreadTest.EXE) są tworzone, nawet jeśli właściwość Instancing Class1 jest oznaczony jako MultiUse.
Może pojawić się komunikaty o błędach wymienionych powyżej, jeżeli masz serwer EXE formantu ActiveX z puli wątków jest większa niż jeden (1), a klient wielowątkowych lub wielu threaded jednego lub wielu klientom szybkie tworzenie i likwidowanie obiektów wewnątrz serwera. Aby obejść ten problem, można utworzyć pusty klasy w lokalny serwer i klient zachować odwołanie do niego, jak pokazano w poniższej sekcji "Więcej informacji".

Stan

To zachowanie jest zgodne z projektem.W programie Visual Studio 6 Service Pack 5, jeżeli projekt zawiera publicznych klasy, która ma MTSTransactionMode ustawiona wartość inną niż 0, Wykonanie instalacji nienadzorowanej Opcja i Zachować w pamięciopcja jest automatycznie zaznaczona.

Więcej informacji

Kroki do odtworzenia problemu

A: tworzenia serwera

  1. Tworzenie projektu EXE formantu ActiveX i zmień jego nazwę ThreadTest.
  2. Z Projekt menu wybierz Właściwości projektu i na Ogólne Karta Wybierz Puli wątków z dwóch (2).
  3. Dodaj następujący kod do domyślnej klasy (Class1):
    Private strClassName As String
    Public Property Let ClassName(ByVal vData As String)
       strClassName = vData
    End Property
    Public Property Get ClassName() As String
       ClassName = strClassName 
    End Property
    					
  4. Zapisz i skompilować projekt (ThreadTest.EXE).

B: tworzenia klienta i badania

  1. Uruchom projekt Standard EXE i zmień jego nazwę Klient.
  2. Dodawanie przycisku polecenia i pole tekstowe do domyślnego formularza (formularz Form1).
  3. Dodaj następujący kod do formularza Form1:
    Private Sub Command1_Click()
       Dim i As Long, j As Long
       Dim o As Object
       j = Val(Text1.Text)
       For i = 1 To j
          DoEvents
          Set o = CreateObject("ThreadTest.Class1")
          o.ClassName = i
          Me.Caption = o.ClassName
          Set o = Nothing
       Next
    End Sub
    Private Sub Form_Load()
       Text1.Text = 1000
       Command1.Caption = "Start"
    End Sub
    					
  4. Skompiluj projekt (Client.EXE).
  5. Trzy lub więcej wystąpień Client.EXE i naciśnij przycisk Start Start przycisk na każdym formularzu. Należy zwrócić uwagę, zobacz jeden lub więcej z powyższych komunikatów o błędzie.

C: obejście wykonawczych

  1. Otwórz projekt ThreadTest.
  2. Dodać inny moduł klasy (Class2) z żadnego kodu.
  3. Zapisz i re-compile projektu (ThreadTest.EXE).
  4. Otwórz projekt klienta.
  5. Zastąp następującego kodu formularza Form1:
    Private p As Object
    Private Sub Command1_Click()
       Dim i As Long, j As Long
       Dim o As Object
       j = Val(Text1.Text)
       For i = 1 To j
          DoEvents
          Set o = CreateObject("ThreadTest.Class1")
          o.ClassName = i
          Me.Caption = o.ClassName
          Set o = Nothing
       Next
    End Sub
    Private Sub Form_Load()
       Text1.Text = 1000
       Command1.Caption = "Start"   
       Set p = CreateObject("ThreadTest.Class2")
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
       Set p = Nothing
    End Sub
    					
  6. Zapisz i re-compile projektu (Client.EXE).
  7. Trzy lub więcej wystąpień Client.EXE i naciśnij klawisz Start przycisk na każdym formularzu. Należy zauważyć, że powinny być widoczne żadne komunikaty o błędach.
Gdy EXE formantu ActiveX z puli wątków więcej niż jeden jest dostępny przez wielu klientów przez model DCOM, obejście problemu opisane w części c sekcja "Więcej informacji" nie działa. W konsekwencji serwerów EXE formantu ActiveX programu Visual Basic 6.0 nie są odpowiednie dla serwerów DCOM z wieloma klientami szybkie tworzenie i likwidowanie obiektów. Jeśli aplikacja serwera musi obsługiwać ten scenariusz, zaleca się używać ActiveX dll w systemie MTS zamiast niego. Podczas projektowania biblioteki DLL ActiveX do obsługiwanych w systemie MTS, upewnij się że Wykonanie instalacji nienadzorowanej i Zachować w pamięci pola wyboru są zaznaczone. Te pola wyboru i znajdują się na Projekt Po wybraniu polecenia menu Właściwości, a następnie wybierz Ogólne Karta.

Nie należy używać Tworzenie wystąpienia GlobalMultiUse Właściwości klasy, jeśli zamierzasz używać składnika ActiveX w programie MTS lub COM +. Dla interfejsu GlobalMultiUse obiekt jest buforowany w na tabelę opartą na wątku i nie jest zwalniane aż do zakończenia wątku. W związku z tym jeśli wywołanie pochodzi z innego kontekstu (chociaż są w tym samym wątku), nie działa z RPC_E_WRONG_THREAD. Aby użyć składników w MTS i modelu COM +, należy projektować klas, w taki sposób, że obiekty są bezstanowe.

Właściwości

Numer ID artykułu: 241896 - Ostatnia weryfikacja: 22 czerwca 2011 - Weryfikacja: 2.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Słowa kluczowe: 
kbprb kbthread kbtophit kbmt KB241896 KbMtpl
Przetłumaczone maszynowo
WAŻNE: Ten artykuł nie został przetłumaczony przez człowieka, tylko przez oprogramowanie do tłumaczenia maszynowego firmy Microsoft. Firma Microsoft oferuje zarówno artykuły tłumaczone przez ludzi, jak i artykuły tłumaczone maszynowo, dzięki czemu każdy użytkownik może uzyskać dostęp do całej zawartości bazy wiedzy Knowledge Base we własnym języku. Prosimy jednak pamiętać, że artykuły przetłumaczone maszynowo nie zawsze są doskonałe. Mogą zawierać błędy słownictwa, składni i gramatyki, przypominające błędy robione przez osoby, dla których język użytkownika nie jest językiem ojczystym. Firma Microsoft nie odpowiada za wszelkie nieścisłości, błędy lub szkody spowodowane nieprawidłowym tłumaczeniem zawartości oraz za wykorzystanie tej zawartości przez klientów. Oprogramowanie do tłumaczenia maszynowego jest często aktualizowane przez firmę Microsoft.
Anglojęzyczna wersja tego artykułu to:241896

Przekaż opinię

 

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