Chyba: Třída GlobalMultiUse nelze ukončit v prostředí více podprocesy

Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.

Projděte si také anglickou verzi článku:300850
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Příznaky
Při volání procedury dvou klientů z ActiveX EXE součást na stejný čas a tento postup v paměti; který je volá jiný postup MultiUse třídy v dynamická knihovna (DLL), pokud tato třída přistupuje k postupu v GlobalMultiUse třídy v jiné ActiveX DLL, EXE ActiveX zůstane součást ActiveX, nezdaří ukončit, dokonce po všech vydána odkazy.

Toto chování nedojde, Visual Basic 6.0 Service Pack 3 (SP3) nebo starší.
Příčina
K tomuto problému dochází, protože funkce DllCanUnloadNow DLL GlobalMultiUse vrátí NEPRAVDA, pokud je aktuálně volána jiným podprocesem. To znamená, že DLL GlobalMultiUse nemusí být možné uvolnit sám v prostředí s více podprocesy.
Řešení
Společnost Microsoft má nyní k dispozici podporovanou opravu hotfix, která je však určena pouze k opravě problému popsaného v tomto článku. Tuto opravu použijte pouze u systémů, ve kterých dochází k popsanému problému.

Poznámka: Musíte mít Visual Studio licenční smlouvy tuto opravu hotfix získat.

Potřebujete-li odstranit tento problém, obraťte se na služby odborné pomoci společnosti Microsoft, kde můžete tuto opravu hotfix získat. Úplný seznam telefonních čísel služeb technické podpory společnosti Microsoft a informace o cenách technické podpory naleznete na tomto webu společnosti Microsoft:Poznámka: Poplatky, které je třeba obvykle zaplatit za telefonní hovory, mohou být stornovány, jestliže pracovník technické podpory společnosti Microsoft zjistí, že oznámený problém lze vyřešit konkrétní aktualizací. Další dotazy a žádosti o odbornou pomoc, které se netýkají této zvláštní opravy, podléhají běžným sazbám za poskytnutí odborné pomoci. Anglická verze této opravy má následující nebo vyšší atributy souborů:
   Date         Time        Version    Size     File name      ---------------------------------------------------------   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll				

Prohlášení
Společnost Microsoft potvrzuje, že se jedná o chybu v Microsoft produktů uvedených na začátku tohoto článku.
Další informace

Kroky pro reprodukci tohoto chování

Vytvořit DLL s třídy GlobalMultiUse

  1. Vytvořit nový projekt ActiveX DLL s výchozí třídy Class1.
  2. V nabídce projekt klepněte na příkaz Project1 vlastnosti. Změnit název projektu GMultiUseDll a potom klepněte na tlačítko OK.
  3. V dialogovém okně nastavit vlastnost Instancing Class1 6 - GlobalMultiUse.
  4. Zkopírujte a vložte následující kód modulu kódu Class1 's:
    Public Function ClassName() As String    ClassName = "Class1"End Function					
  5. V nabídce soubor klepněte na Vytvořit GMultiUseDll.dll kompilovat projektu. Je vytvořen GMultiUseDll.dll.

Vytvořit DLL s MultiUse třídy

  1. Vytvořit nový projekt ActiveX DLL s výchozí třídy Class1.
  2. V nabídce projekt klepněte na příkaz Project1 vlastnosti. Změnit název projektu MultiUseDll a potom klepněte na tlačítko OK.
  3. Z nabídky projektu klepněte na příkaz odkazy, zaškrtněte políčko GMultiUseDll.dll a klepněte na tlačítko OK.
  4. Zkopírujte a vložte následující kód modulu kódu Class1 's:
    Public Function GetString() As String    GetString = ClassNameEnd Function					
  5. V nabídce soubor klepněte na Vytvořit MultiUseDll.dll kompilovat projektu. Je vytvořen MultiUseDll.dll.

Vytvoření projektu ActiveX EXE

  1. Vytvořit nový projekt ActiveX EXE s výchozí třídy Class1.
  2. V nabídce projekt klepněte na příkaz Project1 vlastnosti. Změnit název projektu TestServer a potom klepněte na tlačítko OK.
  3. Z nabídky projektu klepněte na příkaz odkazy, zaškrtněte políčko MultiUseDll.dll a klepněte na tlačítko OK.
  4. V nabídce projekt klepněte na tlačítko Vlastnosti TestServer. Na kartě Obecné nastavte na 10 podprocesů fondu podprocesů.
  5. Zkopírujte a vložte následující kód modulu kódu Class1 's
    Public Sub DoSomething()    Dim obj As MultiuseDll.Class1    Set obj = New MultiuseDll.Class1    obj.GetStringEnd Sub					
  6. V nabídce soubor klepněte na Vytvořit TextServer.exe kompilovat projektu. Je vytvořen TextServer.exe.

Vytvoření projektu klienta

  1. Vytvořit nový projekt standardní EXE s výchozí formulář Form1.
  2. V nabídce projekt klepněte na příkaz Project1 vlastnosti. Změnit název projektu TestClient a potom klepněte na tlačítko OK.
  3. Přidat popisek (Label1), TextBox (Text1) a dvě CommandButtons (Command1 a Command2) Form1.
  4. Zkopírujte a vložte následující kód modulu kódu Form1 's:
    Dim bStop As BooleanPrivate 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    LoopEnd SubPrivate Sub Command2_Click()    bStop = TrueEnd SubPrivate Sub Form_Load()    Text1.Text = "c:\sync.txt"    Command1.Caption = "Start"    Command2.Caption = "Stop"    bStop = FalseEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    bStop = TrueEnd Sub					
  5. V nabídce soubor klepněte na Vytvořit TestClient.exe kompilovat projektu. Je vytvořen TestClient.exe.

Spustit test

  1. Otevřete Poznámkový blok. Přidat písmeno „ t „ první pozici a uložte soubor jako Sync.txt v kořenovém adresáři jednotky c:
  2. Spustit dvě instance TestClient.exe. Všimněte si, že jsou spuštěny dva TestClient.exe procesy ve Správci úloh.
  3. Obě instance TestClient klepněte na tlačítko Start.
  4. Otevřete Sync.txt. Změnit na hodnotu „ true „ první řádek a uložit.

    Všimněte si TestServer.exe proces ve Správci úloh po uložení souboru.
  5. Klepněte na tlačítko Zastavit pro obě instance TestClient a zavření formuláře. Všimněte si, že neexistují žádné instance spuštění TestClient.exe. V tomto okamžiku TestServer.exe zůstane načtený.
Další informace o problémech souvisejících s využitím podprocesů v jazyka, klepněte na níže uvedené číslo článku databáze Microsoft Knowledge Base:
241896PRB: Problémy s ActiveX Components Visual Basic 6.0 threading
Multi-Thread

Upozornění: Tento článek je přeložený automaticky

Vlastnosti

ID článku: 300850 - Poslední kontrola: 02/28/2014 17:05:18 - Revize: 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 KbMtcs
Váš názor