Rubrik: Windows/System | 22.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, WinME | Views: 13.116 |
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:
lpThreadAttributes | Erwartet 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. |
dwStackSize | Erwartet die Größe des Stackspeichers, der zur Initialisierung verwendet werden soll. Alternativ kann hier derWert "0" übergeben werden, um den Standardwert zu nutzen. |
lpStartAddress | Erwartet die Funktionsadresse eines imProzess befindlichen Speicherbereiches, die der Thread aufrufen soll. |
lParameter | Erwartet einen Parameter, der der aufzurufenden Funktion übergeben werden kann, falls benötigt. |
dwCreationFlags | Hier kann die folgende Konstante übergeben werden, um das Starten des Threads zu steuern, andernfalls muss hier derWert "0" übergeben werden. |
lpThreadID | Erwartet 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