VB6
1. Hoe beeindig ik een proces? 
Processen beeindigen in windows verschilt tussen 98/ME en 2000/XP. Hieronder staan twee voorbeelden over hoe je processen kunt beeindigen:
Private Const MAX_PATH = 260
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szexeFile As String * MAX_PATH
End Type
Private Function KillApp(myName As String) As Boolean
Const PROCESS_ALL_ACCESS = 0
Dim uProcess As PROCESSENTRY32
Dim rProcessFound As Long
Dim hSnapshot As Long
Dim szExename As String
Dim exitCode As Long
Dim myProcess As Long
Dim AppKill As Boolean
Dim appCount As Integer
Dim i As Integer
On Local Error GoTo Finish
appCount = 0
Const TH32CS_SNAPPROCESS As Long = 2&
myName = LCase(myName)
uProcess.dwSize = Len(uProcess)
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
rProcessFound = ProcessFirst(hSnapshot, uProcess)
Do While rProcessFound
i = InStr(1, uProcess.szexeFile, Chr(0))
szExename = LCase(Left$(uProcess.szexeFile, i - 1))
If Right(szExename, Len(myName)) = myName Then
KillApp = True
appCount = appCount + 1
myProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID)
AppKill = TerminateProcess(myProcess, exitCode)
Call CloseHandle(myProcess)
End If
rProcessFound = ProcessNext(hSnapshot, uProcess)
Loop
Call CloseHandle(hSnapshot)
Finish:
End Function
Private Sub Form_Load()
KillApp "\apache.exe"
End
End Sub
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Const GW_HWNDNEXT = 2
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Sub TerminateProc(ByVal pid As Long)
Dim hwnd As Long
hwnd = InstanceToWnd(pid)
Const PROCESS_ALL_ACCESS = &H1F0FFF
Dim ThreadIDX As Long
Dim PROCESSIDX As Long
Dim EXCODE As Long
Dim PROCESS As Long
ThreadIDX = GetWindowThreadProcessId(hwnd, PROCESSIDX)
PROCESS = OpenProcess(PROCESS_ALL_ACCESS, 0, PROCESSIDX)
Call GetExitCodeProcess(PROCESS, EXCODE)
Call TerminateProcess(PROCESS, EXCODE)
Call CloseHandle(PROCESS)
End Sub
Private Function InstanceToWnd(ByVal target_pid As Long) As Long
Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
Do While test_hwnd 0
If GetParent(test_hwnd) = 0 Then
test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
If test_pid = target_pid Then
InstanceToWnd = test_hwnd
Exit Do
End If
End If
test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
Loop
End Function
Public Function KillProcess(ByVal exename As String)
exename = LCase(exename)
Dim hSnapShot As Long, uProcess As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
Dim r As Long
r = Process32First(hSnapShot, uProcess)
Do While r
Dim fn As String
fn = LCase(TrimNull(uProcess.szExeFile))
If fn = exename Then TerminateProc uProcess.th32ProcessID
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Function
Private Function TrimNull(s As String) As String
TrimNull = Left(s, InStr(s & Chr(0), Chr(0)) - 1)
End Function
2. Hoe verander ik de resolutie? 
Voor het veranderen van de resolutie bestaat een handig project op VBWereld in de Codebase. Je kunt dit project hier vinden:
Resolutie.
3. Hoe start ik een programma (of hoe open ik een tekstbestand in Notepad of hoe open ik een website in Internet Explorer)? 
Je kunt een extern programma op verschillende manieren starten vanuit jouw Visual Basic programma. Twee manieren zijn het gebruiken van de Visual Basic
Shell functie, en het gebruiken van de Windows API
ShellExecute.
Shell functie
De shell functie start een op te geven programma op en geeft het programma taak id terug (als een Variant(Double)).
| padnaam | vbString | naam van het programma dat opgestart moet worden (of een url van een website!) |
| vensterstijl | vbInteger | Optioneel; de stijl van het venster waarin het programma moet worden opgestart, deze kan de volgende waarden hebben: vbHide, vbNormalFocus, vbMinimizedFocus, vbMaximizedFocus, vbNormalNoFocus, vbMinimizedNoFocus |
|
| return | vbDouble | het taak id van het programma dat opgestart is |
Shell "http://www.vbwereld.nl", vbMaximizedFocus
ShellExecute API
Met de ShellExecute API kun je op vergelijkbare manier een programma starten. Echter, je kunt hierbij meer parameters opgeven en in meer detail aangeven hoe een programma opgestart moet worden. Voor een beschrijving van alle parameters zie
ShellExecute op AllAPI.
Public Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_HIDE = 0
Public Const SW_NORMAL = 1
Public Const SW_MAXIMIZE = 3
Public Const SW_MINIMIZE = 6
ShellExecute Me.hWnd, "open", "Notepad.exe", vbNullChar, vbNullChar, SW_NORMAL
ShellExecute Me.hWnd, "open", "http://www.vbwereld.nl/", vbNullChar, vbNullChar, SW_NORMAL
ShellExecute Me.hWnd, "open", "mailto:wout@vbwereld.nl", vbNullChar, vbNullChar, SW_NORMAL
Als je in de aanroep "open" vervangt door "explore", dan zal de Windows Verkenner gestart worden als je een directory opgeeft. Zie het verschil tussen:
ShellExecute Me.hWnd, "open", "C:\Windows\", vbNullChar, vbNullChar, SW_NORMAL
ShellExecute Me.hWnd, "explore", "C:\Windows\", vbNullChar, vbNullChar, SW_NORMAL
4. Hoe verwijder ik een bestand? 
Een bestand verwijderen kan met het Visual Basic
Kill statement.
| padnaam | vbString | het bestand dat verwijderd moet worden. Om meerdere bestanden tegelijkertijd te verwijderen kun je de wildcards * en ? gebruiken |
Kill App.Path & "/test.txt"
Noot: Als het bestand niet bestaat krijg je een Error. Je kunt controleren of een bestand bestaat met de Dir functie.
5. Hoe zorg ik er voor dat een programma wordt gestart bij het opstarten van Windows? 
Je kunt onder Windows een programma automatisch laten starten door dit in het register te zetten. Je kunt sleutels plaatsen in
HKEY_CURRENT_USER\Software\Microsoft\WindowsCurrentVersion\Run (om het programma te starten als de huidige gebruiker inlogd), of
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsCurrentVersion\Run (om het programma te starten bij iedere willekeurige gebruiker die inlogd). In de VBWereld Codebase staat een module waarmee je waarden in het register kunt lezen, veranderen en toevoegen. Deze module kun je gebruiken om je sleutel toe te voegen waarmee jouw programma voortaan automatisch start, zie
Register Edit Module.
6. Hoe gebruik ik Winsock om gegevens over te sturen tussen een client en een server? 
In de VBWereld Tutoriki staat een uitgebreide tutorial over hoe je Winsock kunt gebruiken om een simpele server/client chat applicatie te maken. Dit is een goed uitgangspunt om te zien hoe je met Winsock kunt werken en een uitgebreide beschrijving van alle eigenschappen en functies van het Winsock object. Zie:
WinsockTutorial.
7. Hoe kan ik makkelijk een eigenschap van meerdere controls aanpassen? 
Dat kan je doen door een zogenaamde "control array" te maken. Een control array is eigenlijk een array als alle andere, met als datatype het type van de controls die erin zitten.
Zo kan je een control array maken:
- Plaats een control op een Form.
- Stel de eigenschap Index van de control in op 0.
- Voeg nog meer controls van hetzelfde type toe en geef die dezelfde naam als de eerste control en geef ze een waarde voor de eigenschap Index.
Je kan stap 3 makkelijk doen door de eerste control te selecteren en dan te kopiëren en te plakken (Ctrl+C, Ctrl+V).
Alle controls in een control array delen de eventmethodes (bijvoorbeeld Click en MouseOver). In de methoden is er wel een extra variabele beschikbaar, Index, die aangeeft door welke control het event is opgetreden.
In plaats van:
Text1.Text = "Nieuwe tekst 1"
Text2.Text = "Nieuwe tekst 2"
Text3.Text = "Nieuwe tekst 3"
Text4.Text = "Nieuwe tekst 4"
kan je nu schrijven:
Dim Index As Integer
For Index = 1 To 4
Text(Index).Text = "Nieuwe tekst " + Index
Next Index
8. Hoe verzend ik een e-mail? 
Er zijn verschillende oplossingen om e-mail te verzenden.
- Voorbeeldproject om met MAPI e-mail te verzenden.
- SMTP Component, gratis voor niet-commercieel gebruik.
- Implementeer met een Winsock control zelf een SMTP client, aan de hand van het protocol (1 2) of dit voorbeeld van hoe je het met Telnet doet. Zoeken op Planet Source Code hiervan levert waarschijnlijk wel voorbeelden hiervan op.
- Gebruik Outlook vanuit VB. Op de site van Microsoft staat uitgelegd hoe.
Op internet zijn ook veel
voorbeelden te vinden.
VB.NET
1. Hoe wijzig of lees ik een variabele van een ander form in VB.NET? 
In vb.net werk je met instanties van formulieren. Hierdoor kun je niet "Mijnformulierklassenaam.Variabele" gebruiken. Je kunt het op deze manier oplossen:
Public Class Form1
Inherits System.Windows.Forms.Form
End Class
Private MijnKlasseVariabele As String
Public Property MijnVariabele As String
Get
Return MijnKlasseVariabele
End Get
Set ( ByVal Value As String )
MijnKlasseVariabele = Value
End Set
End Property
Als je nu MijnKlasseVariabele wilt wijzigen vanuit een ander formulier heb je een instantie van de klasse ( in dit geval ) Form1 nodig. Zie de volgende vraag hoe je het beste een instantie kunt doorgeven aan een formulier.
Dim pForm As Form1 = New Form1
pForm.MijnVariabele = "Test"
2. Hoe kan ik een instantie van een klasse doorgeven aan een andere klasse waardoor ik de gegevens van deze klasse kan gebruiken? 
Je kunt dit het beste aanpakken door de instantie van de klasse door te geven aan de andere klasse via de constructor:
Public Class Form2
Inherits System.Windows.Forms.Form
Private MijnForm1 As Form1
Public Sub New(pForm1 As Form1)
MijnForm1 = pForm1
End Sub
Private Sub button_click(sender As object, e As eventargs)
mijnform1.MijnVariabele = "Test"
End Sub
Dim pForm As Form2 = New Form2(Me)
pForm.Show()
3. Hoe kan ik bestanden lezen en schrijven? 
In vb6 werkte je min of meer met filehandles, in vb.net werk je met filestreams. Dit heet zo omdat je "streams" van data leest van of schrijft naar een bestand.
Dim pWriter As StreamWriter = New StreamWriter("MijnFile.txt")
pWriter.WriteLine("MijnRegel")
pWriter.Flush()
pWriter.Close()
Dim pReader As StreamReader = New StreamReader("MijnBestand.txt")
Dim sLine As String = pReader.ReadLine()
pReader.Close()
4. Hoe maak ik verbinding met een database in .NET? 
Dim pConnection As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=EnqueteDB.mdb")
Try
pConnection.Open()
Catch ex As OleDbException
MessageBox.Show("Fout: " & ex.Message)
End Try
5. Hoe maak ik een query in .NET? 
Dim pDbAdapter As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM tblGebruikers", pConnection)
Dim pDataset As DataSet = New DataSet
Dim sColumns As String = ""
Dim sRow As String = ""
Try
pDbAdapter.Fill(pDataset)
Catch ex As OleDbException
MessageBox.Show("Fout: " & ex.Message)
Return
End Try
For i As Integer = 0 To pDataset.Tables(0).Columns.Count - 1
MessageBox.Show(pDataset.Tables(0).Columns(i).ColumnName)
Next
For i As Integer = 0 To pDataset.Tables(0).Rows.Count - 1
MessageBox.Show(pDataset.Tables(0).Rows(i)("GebruikerID"))
Next
pConnection.Close()
pDbAdapter.Dispose()
6. Hoe maak ik een bijwerkquery in .NET? 
Dim pCommand As OleDbCommand = New OleDbCommand(String.Format("UPDATE tblGebruikers SET GebruikerNaam = '{0}'", "VbWereld"), pConnection)
Try
pCommand.ExecuteNonQuery()
pConnection.Close()
pCommand.Dispose()
Catch ex As OleDbException
MessageBox.Show("Fout: " & ex.Message)
Return
End Try