vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2014
 
zurück
Rubrik: Windows/System22.03.05
CreateThread-Funktion

Diese Funktion erstellt einen Thread, der mittels einer Funktionsadresse eine Funktion im aktuellen Prozess aufruft.

Betriebssystem:  Win95, Win98, WinNT 3.1, Win2000, WinMEViews:  7.260 

Deklaration:

Declare Function CreateThread Lib "kernel32" ( _
  lpThreadAttributes As Any, _
   ByVal dwStackSize As Long, _
  ByVal lpStartAddress As Long, _
  ByVal lParameter  As Long, _
  ByVal dwCreationFlags As Long, _
  lpThreadID As Long) As Long

Beschreibung:
Diese Funktion erstellt einen Thread, der mittels einer Funktionsadresse eine Funktion im aktuellen Prozess aufruft.

Parameter:
lpThreadAttributesErwartet eine SCURITY_ATTRIBUTES-Struktur die beschreibt, ob Kindprozesse diesen Thread erben können. Alternativ kann hier auch derWert "0" übergeben werden wenn die Standard-Sicherheitseinstellungen verwendet werden sollen.
dwStackSizeErwartet die Größe des Stackspeichers, der zur Initialisierung verwendet werden soll. Alternativ kann hier derWert "0" übergeben werden, um den Standardwert zu nutzen.
lpStartAddressErwartet die Funktionsadresse eines imProzess befindlichen Speicherbereiches, die der Thread aufrufen soll.
lParameterErwartet einen Parameter, der der aufzurufenden Funktion übergeben werden kann, falls benötigt.
dwCreationFlagsHier kann die folgende Konstante übergeben werden, um das Starten des Threads zu steuern, andernfalls muss hier derWert "0" übergeben werden.
lpThreadIDErwartet eineLong-Variable, die mit dem ID des Threads gefüllt wird. Unter Windows NT, 2000 und XP kann auch derWert "0" zurückgegeben werden.

dwCreationFlags Konstanten:

Const CREATE_SUSPENDED = &H4
' Der Thread wird erst gestartet, wenn die ResumeThread-Funktion aufgerufen wird.

Rückgabewert:
Ist die Funktion erfolgreich, so wird das Handle des erstellten Threads zurückgegeben, andernfalls derWert "0". Für erweiterte Fehlerinformationen rufen Sie die GetLastError-Funktion auf.

Beispiel:

Private Declare Function LoadLibrary Lib "kernel32" _
  Alias "LoadLibraryA"  ( _
  ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" ( _
  ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" ( _
  ByVal hModule As Long, _
  ByVal lpProcName As String) As Long
Private Declare Function CreateThread Lib "kernel32" ( _
  lpThreadAttributes As Any, _
  ByVal dwStackSize As Long, _
  ByVal lpStartAddress As Long, _
  ByVal lParameter As Long, _
  ByVal dwCreationFlags As Long, _
  lpThreadID As Long) As Long 
Private Declare Function WaitForSingleObject Lib "kernel32" ( _
  ByVal hHandle  As Long, _
  ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
  ByVal hObject As Long)  As Long
 
' CreateThread dwCreationFlags-Konstante
Private Const CREATE_SUSPENDED = &H4 ' Der Thread wird erst gestartet, wenn  
' die ResumeThread-Funktion aufgerufen wird
 
' eine der RegisterServer Rückgabe-Konstanten
Private Const S_OK = &H0
 
' eine der WaitForSingleObject dwMilliseconds-Konstanten
Private Const INFINITE = &HFFFF
 
' Eigene Konstanten Sammlung
Private Enum TLoc
  LocalThread = 0
  ExternThread = 1
End Enum
' Wählt eine Datei zum Registrieren aus
Private Sub Command1_Click()
  On Error GoTo CancelErr
 
  With CommonDialog1
    .CancelError = True
    .DialogTitle = "Datei zum Registrieren Öffnen"
    .Filter = "Alle Dateien|*.*|Alle  _
    Bibliotheken|*.exe;*.ocx;*.dll;*.drv;*.vxd;*.tlb|*.EXE -  _
    Anwendungen|*.exe|*.OCX - ActiveX Datei|*.ocx|" & _
    "*.DLL - DLL Libary|*.dll|*.DRV - Geräte Treiber|*.drv|*.VXD -  _
    Virtueller Treiber|*.vxd"
    .Flags = cdlOFNFileMustExist
    .InitDir = App.Path
    .ShowOpen
 
    Label2.Caption = .FileTitle
    Label2.Tag = .FileName
  End With
  Exit Sub
 
  Label2.Caption = ""
  Label2.Tag = ""
End Sub
' De- / Registriert eine Datei intern oder extern (RegSvr32.exe)
Private Function RegFile(ByVal ThreadLocation As TLoc, ByVal ExParams As String) 
  Dim hProc As Long, hModule As Long, hThread As Long, ThreadID As Long
  Dim hExitCode As Long, Retval As Long
 
  Select Case ThreadLocation
  Case LocalThread ' Selbst registrieren
 
    ' Datei laden
    hModule = LoadLibrary(Label2.Tag)
 
    If hModule << 0 Then
 
      ' Funktionsadresse zum Registrieren ermitteln
      hProc = GetProcAddress(hModule, ExParams)
 
      If hProc << 0 Then
        ' Neuen Thread mit der ermittelten Funktionsadresse starten
        hThread = CreateThread(ByVal 0&, 0&, hProc, 0&, 0&, ThreadID) 
 
        ' Warten, dass die Funktion abgeschlossen wurde
        Retval = WaitForSingleObject(hThread, INFINITE)
        If Retval << S_OK Then
          MsgBox "Die Datei konnte nicht De- / Registriert werden" 
        Else
          MsgBox "Die Datei wurde erfolgreich De- / Registriert" 
        End If
      Else
        MsgBox "Es konnte kein Eintrag zum De / Registrieren  _
        der Datei gefunden werden"
      End If
 
      ' Thread Handle freigeben
      Retval = CloseHandle(hThread)
 
      ' Datei wieder entladen
      Retval = FreeLibrary(hModule)
    Else
      MsgBox "Die Datei konnte nicht geladen werden."
    End If
 
  Case ExternThread ' per RegSVR32 Registrieren
 
    Shell "regsvr32.exe " & ExParams, vbNormalFocus
  End Select
End Function
' Ruft ein Popupmenü zum Auswählen der Registrierungsmethode auf
Private Sub Command2_Click()
  If Label2.Tag << "" Then
    Me.PopupMenu Mnu_FileReg
  End If
End Sub
' Datei manuell registrieren
Private Sub Mnu_RegIn_Click()
  Call RegFile(LocalThread, "DllRegisterServer")
End Sub
' Datei registrieren über Regsvr32.exe
Private Sub Mnu_RegEx_Click()
  Call RegFile(ExternThread, Label2.Tag)
End Sub
' Datei manuell deregistrieren
Private Sub Mnu_UnRegIn_Click()
  Call RegFile(LocalThread, "DllUnregisterServer")
End Sub
' Datei deregistrieren über Regsvr32.exe
Private Sub Mnu_UnRegEx_Click()
  Call RegFile(ExternThread, Label2.Tag & " /u")
End Sub

Diese Seite wurde bereits 7.260 mal aufgerufen.

nach obenzurück
 
   

Druckansicht Druckansicht Copyright ©2000-2014 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.

Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel