Quicklinks: nieuws | forum! | tutoriki | codebase | links | home
Welkom bezoeker, inloggen of registreren?

FrequentlyAskedQuestions






VB6




1. Hoe beeindig ik een proces? Image

Processen beeindigen in windows verschilt tussen 98/ME en 2000/XP. Hieronder staan twee voorbeelden over hoe je processen kunt beeindigen:

Processen beeindigen onder Windows 98 en Windows ME
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

Processen beeindigen onder Windows 2000 en Windows XP
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
  'Find the first window
  test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
  Do While test_hwnd 0
    'Check if the window isn't a child
    If GetParent(test_hwnd) = 0 Then
      'Get the window's thread
      test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
      If test_pid = target_pid Then
        InstanceToWnd = test_hwnd
        Exit Do
      End If
    End If
    'retrieve the next window
    test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
  Loop
End Function

Public Function KillProcess(ByVal exename As String)
  exename = LCase(exename)
  
  'KPD-Team 2000
  'URL: http://www.allapi.net/
  'E-Mail: KPDTeam@Allapi.net
  Dim hSnapShot As Long, uProcess As PROCESSENTRY32
  'Takes a snapshot of the processes and the heaps, modules, and threads used by the processes
  hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
  'set the length of our ProcessEntry-type
  uProcess.dwSize = Len(uProcess)
  'Retrieve information about the first process encountered in our system snapshot
  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
  
  'close our snapshot handle
  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? Image

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)? Image

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)).
Syntax
Argumenten
ArgumentTypeBeschrijving
padnaamvbStringnaam van het programma dat opgestart moet worden (of een url van een website!)
vensterstijlvbIntegerOptioneel; de stijl van het venster waarin het programma moet worden opgestart, deze kan de volgende waarden hebben: vbHide, vbNormalFocus, vbMinimizedFocus, vbMaximizedFocus, vbNormalNoFocus, vbMinimizedNoFocus

returnvbDoublehet taak id van het programma dat opgestart is
Voorbeeld
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.


ShellExecute voorbeeld
'In een module
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

'Ergens in je form
'-
'Start Kladblok
ShellExecute Me.hWnd, "open", "Notepad.exe", vbNullChar, vbNullChar, SW_NORMAL

'Open VBwereld met de standaard-browser
ShellExecute Me.hWnd, "open", "http://www.vbwereld.nl/", vbNullChar, vbNullChar, SW_NORMAL

'Stuur een e-mail naar wout@vbwereld met de standaard-e-mailer
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:


Gebruik maken van 'open'
ShellExecute Me.hWnd, "open", "C:\Windows\", vbNullChar, vbNullChar, SW_NORMAL

Gebruik maken van 'explore'
ShellExecute Me.hWnd, "explore", "C:\Windows\", vbNullChar, vbNullChar, SW_NORMAL



4. Hoe verwijder ik een bestand? Image

Een bestand verwijderen kan met het Visual Basic Kill statement.
Syntax
Kill padnaam
Argumenten
ArgumentTypeBeschrijving
padnaamvbStringhet bestand dat verwijderd moet worden. Om meerdere bestanden tegelijkertijd te verwijderen kun je de wildcards * en ? gebruiken
Voorbeeld
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? Image

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.


Voorbeeld om een sleutel toe te voegen
TODO: voorbeeld code



6. Hoe gebruik ik Winsock om gegevens over te sturen tussen een client en een server? Image

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? Image

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:
  1. Plaats een control op een Form.
  2. Stel de eigenschap Index van de control in op 0.
  3. 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:

Code
Text1.Text = "Nieuwe tekst 1"
Text2.Text = "Nieuwe tekst 2"
Text3.Text = "Nieuwe tekst 3"
Text4.Text = "Nieuwe tekst 4"
kan je nu schrijven:

Code
Dim Index As Integer
For Index = 1 To 4
  Text(Index).Text = "Nieuwe tekst " + Index
Next Index



8. Hoe verzend ik een e-mail? Image

Er zijn verschillende oplossingen om e-mail te verzenden.
  1. Voorbeeldproject om met MAPI e-mail te verzenden.
  2. SMTP Component, gratis voor niet-commercieel gebruik.
  3. 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.
  4. 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? Image

In vb.net werk je met instanties van formulieren. Hierdoor kun je niet "Mijnformulierklassenaam.Variabele" gebruiken. Je kunt het op deze manier oplossen:

In het formulier met de gewenste variabele:
'Tussen:
Public Class Form1
  Inherits System.Windows.Forms.Form
  
  'en:
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.

Instantie doorgeven
'Maak instantie van Form1
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? Image

Je kunt dit het beste aanpakken door de instantie van de klasse door te geven aan de andere klasse via de constructor:

Code
'We willen nu gegevens van Form1 bewerken vanuit Form2

Public Class Form2
  Inherits System.Windows.Forms.Form
  
  Private MijnForm1 As Form1
  'De constructor wordt aangegeven met public sub New()
  
  Public Sub New(pForm1 As Form1)
    'Geef de instantie door aan een private variabele
    MijnForm1 = pForm1
  End Sub
  
  Private Sub button_click(sender As object, e As eventargs)
    'Je kunt nu de gegevens benaderen
    mijnform1.MijnVariabele = "Test" 'Zie vorige vraag
  End Sub
  

Code
  'Dus wanneer we nu een form2 willen aanmaken vanuit form1
  Dim pForm As Form2 = New Form2(Me)
  
  pForm.Show()
  



3. Hoe kan ik bestanden lezen en schrijven? Image

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.

Regel naar een bestand schrijven
  'Er bestaat een overload van streamwriter waar je met een boolean kunt aangeven of je wilt 'appenden'
  'Zet Imports System.IO bovenaan bij de rest van de imports
  
  Dim pWriter As StreamWriter = New StreamWriter("MijnFile.txt")
  
  pWriter.WriteLine("MijnRegel")
  pWriter.Flush() 'Forceer een 'flush', het wegschrijven van de buffer.
  pWriter.Close()
  

Regel uit een bestand lezen
  Dim pReader As StreamReader = New StreamReader("MijnBestand.txt")
  
  Dim sLine As String = pReader.ReadLine()
  
  'Om alles te lezen kun je pReader.ReadToEnd() gebruiken
  
  pReader.Close()
  



4. Hoe maak ik verbinding met een database in .NET? Image


Code
  'In dit voorbeeld maken we verbinding met een Access database. Wanneer je verbinding wilt maken met een SQL server of Odbc gebruik je de daarvoor gemaakte klassen die je kunt vinden in System.Data.SqlClient of System.Data.Odbc
  
  'Bovenaan je code, onderaan de imports, plaats je “Imports System.Data” en "Imports System.Data.OleDb"
  
  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? Image


Code
  'We gebruiken de verbinding die we met bovenstaande code hebben gemaakt.
  
  'De OleDbDataAdapter implementeert de interface IDataAdapter, net zoals de klasse SqlDataAdapter en OdbcDataAdapter. Je hoeft dus, wanneer je deze code voor een ander type database wilt gebruiken, alleen “OleDb” in Sql of in Odbc te veranderen.
  
  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
  
  'Na elke query sluit je de verbinding weer. Hierdoor wordt de verbinding 'teruggegeven’ aan de connection pool. Wanneer je weer een verbinding maakt zal deze uit de pool komen. De pool wordt ook gedeeld met andere applicaties. Door connection pooling te gebruiken zal het aantal verbindingen met de database verminderen waardoor het beter zal presteren.
  
  pConnection.Close()
  pDbAdapter.Dispose()
  



6. Hoe maak ik een bijwerkquery in .NET? Image


Code
  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
  

Gerefereerd door: