Visual Basic 6 & API's - Een andere aanpak
In de afgelopen jaren heb ik met grote regelmaat aandacht besteedt aan het fenomeen API’s. API’s zijn feitelijk niet meer dan functies in een DLL, die u vanuit uw Visual Basic applicatie kunt benaderen. Hierdoor komen geavanceerde mogelijkheden binnen het handbereik van iedere Visual Basic programmeur. Elke API of functie dient u in uw applicatie te declareren en u moet van te voren exact weten welke parameters de functie verwacht en welk object of variabele eventueel wordt teruggeven. Hierdoor worden API’s vaak als lastig ervaren, ook omdat men vaak te maken heeft met datatypen uit C++ en de beschrijvingen vaak op deze taal gebaseerd zijn. Toch kan het eenvoudiger…
Een DLL (Dynamic Link Library) kan ook een COM-object zijn. Hierdoor kan men binnen Visual Basic een referentie maken naar deze DLL en de functies die in die DLL zitten met behulp van objecten met eventuele properties en methods benaderen. Hierdoor wordt het werken ermee een stuk eenvoudiger omdat u dan ook hulp krijgt van uw Visual Basic omgeving in de vorm van Intellisense.

Afbeelding 1. COM-object met intellisense
Een voorwaarde is dat het een COM-object betreft en dat u binnen uw applicatie een referentie naar dit object of naar de desbetreffende DLL maakt. In dit artikel laat ik u kennis maken met sommige objecten binnen de SHELL32.DLL. De objecten die zich in deze DLL bevinden zijn niet direct zichtbaar wanneer u uw Refrerences scherm toont. U dient daarom deze DLL handmatig toe te voegen door gebruik te maken van de ‘Browse…’ knop in het ‘References’scherm. U selecteert vervolgens SHELL32.DLL; deze bevindt zich doorgaans in c:\windows\system32. Nadat u deze referentie hebt toegevoegd ziet u ‘Microsoft Shell Controls And Automation’ in de lijst staan (zie figuur 1). Deze DLL herbergt een groot aantal objecten, waarmee u ontzettend veel mogelijkheden heeft. Laten we dit object eens nader bestuderen…

Afbeelding 2. Een referentie toevoegen
Aan de slag
Om een object te kunnen gebruiken dienen we het te dimensioneren, instantiëren en na gebruik netjes op te ruimen. Plaats de volgende code binnen het form waarbinnen u de objecten wilt aanroepen.
Private mobjShell As Shell32.Shell
Private Sub Form_Initialize()
Set mobjShell = New Shell32.Shell
End Sub
Private Sub Form_Terminate()
Set mobjShell = Nothing
End Sub
|
| Codevoorbeeld 1. |
U ziet dat er in dit geval een object wordt gemaakt van het type ‘Shell32.Shell’. Dit object beschikt over een aantal zeer handige functies, bijvoorbeeld de functie ControlPanelItem. Hiermee toont u met een regel code een item uit het configuratiescherm. Wanneer u bijvoorbeeld de ‘Telefoon- en modemopties’ wilt tonen heeft u alleen de volgende code nodig:
mobjShell.ControlPanelItem "telephon.cpl" |
| Codevoorbeeld 2. |
Als parameter geeft u de bestandsnaam aan van het .cpl bestand dat zich in de system32 map bevindt. Zie tabel 1 voor een overzicht van mogelijke parameters. Afhankelijk van het besturingssysteem en de eventueel geïnstalleerde software kunnen er op uw werkstation misschien meerdere mogelijkheden zijn.
|
access.cpl |
Toegankelijkheidsopties |
|
appwiz.cpl |
Software |
|
desk.cpl |
Beeldscherm |
|
hdwwiz.cpl |
Hardware |
|
inetcpl.cpl |
Internet-opties |
|
intl.cpl |
Landinstellingen |
|
joy.cpl |
Spelbesturingen |
|
main.cpl |
Muis |
|
mmsys.cpl |
Geluid en audioappraten |
|
ncpa.cpl |
Netwerkverbindingen |
|
nusrmgr.cpl |
Gebruikersaccounts |
|
odbccp32.cpl |
ODBC-Gegevensbronbeheer |
|
powercfg.cpl |
Energiebeheer |
|
sysdm.cpl |
Systeem |
|
telephon.cpl |
Telefoon- en modem opties |
|
timedate.cpl |
Datum en tijd |

Afbeelding 3. Schermen behorende bij twee .cpl bestanden
Naast de ControlPanelItem functie kent het Shell object, zoals reeds eerder geschreven, veel meer functies en methoden. Hieronder treft u een opsomming aan van de meest in het oog springende…
Explore
Met de functie kunt u een bepaalde map verkennen. U dient het volledige pad of een constante uit de reeks ShellSpecialFolderConstants mee te geven. U roept de functie alsvolgt aan:
'Toon map 'Geschiedenis' mobjShell.Explore esfHistory
'Toon map 'Projecten' op D:
mobjShell.Explore "d:\Projecten\" |
| Codevoorbeeld 3. |
FileRun, FindComputer en FindFiles
Met behulp van de methods toont u achtereenvolgens het ‘Uitvoeren’ scherm, het ‘Zoeken Computer’ scherm en het ‘Bestand Zoeken’ scherm. Dezelfde functionaliteit die u kunt verkrijgen door bijvoorbeeld op ‘Start’ te klikken en vervolgens op ‘Uitvoeren’
'Toon 'Computer Zoeken' scherm mobjShell.FindComputer
|
| Codevoorbeeld 4. |
SetTime
Het dialoogkader ‘Eigenschappen voor Datum en Tijd’ kunt u tonen door het aanroepen van de SetTime method. Wederom is één regel code voldoende:
'Toon 'Eigenschappen voor Datum/Tijd' mobjShell.SetTime
|
| Codevoorbeeld 5. |
MinimizeAll
Ik bracht voor een maand geleden een collega helemaal in vervoering toen ik hem wees op de mogelijkheid om, met één handeling, alle schermen die binnen Windows open zijn te minimaliseren. Hierdoor hebt u direct weer een leeg bureaublad, waardoor eventuele snelkoppelingen die zich op dat bureaublad bevinden weer toegankelijk worden. Deze functionaliteit bevindt zich, volgens mij, op systemen vanaf Windows 98 (Het knopje ‘Bureaublad weergeven’ direct naast uw Startmenu). U kunt dit ook vanuit uw eigen applicatie doen met behulp van de MinimizeAll functie.
'Minimaliseer alle open programma’s mobjShell.MinimizeAll
|
| Codevoorbeeld 6. |
BrowseForFolder
Om de method BrowseForFolder succescol te gebruiken moeten we iets meer code typen. In het voorbeeld dat ik nu ga uitwerken dient u ook gebruik te maken van het FolderItems- en FolderItem-object. Met behulp van de objecten kunt u ook eenvoudig door alle items in een map of directory lopen en per item een aantal eigenschappen opvragen en instellen. Bekijkt u eens de volgende code:
Dim objFolder As Shell32.Folder Dim objFolderItems As Shell32.FolderItems Dim objFolderItem As Shell32.FolderItem Dim strFolderItems As String
'Vraag de gebruiker om een map te selecteren
Set objFolder = mobjhell.BrowseForFolder(Me.hWnd, _
"Selecteer een map", _
ebfDontGoBelowDomain, _
"C:\Program Files")
'Alleen wat doen als we ook echt een map hebben
If Not objFolder Is Nothing Then
'Bepaal items in map
Set objFolderItems = objFolder.Items
'Doorloop alle items in de collectie
For Each objFolderItem In objFolderItems
With objFolderItem
'Maak een string met folderitem info
strFolderItems = strFolderItems & .Path & _
" - " & .Size & " - " & _
.IsFolder & vbCrLf
End With
Next
End If
'Toon Text
txtBrowsForFolder.Text = strFolderItems
'Ruim objectenn op
Set objFolder = Nothing
Set objFolderItem = Nothing
Set objFolderItems = Nothing
|
| Codevoorbeeld 7. |
We vragen de gebruiker om een map te selecteren. Daarna bepalen we of de gebruiker daadwerkelijk ‘iets’ heeft geselecteerd en doorlopen vervolgens alle items in die map. Dit kunnen subdirectories zijn, maar ook bestanden. Van die items bepalen we vervolgens drie eigenschappen: .Path, .Size en .IsFolder.
Om u een indruk te geven van de properties van zo’n Folder-object heb ik ze voor u op een rijtje gezet:
- .Application
- .GetFolder
- .GetLink
- .IsBrowsable
- .IsFileSystem
- .IsFolder
- .ModifyDate
- .Name
- .Parent
- .Size
- .Type
De meeste eigenschappen spreken waarschijnlijk voor zich. De .BrowsForFolder functie verwacht een viertal parameters. Voor een complete beschrijving van de functie verwijs ik u naar de website van Microsoft. Een gedetailleerde beschrijving hoe u die informatie kan vinden, treft u later in dit artikel aan. Wat u hopelijk duidelijk is geworden, dat het programmeren van de Shell redelijk eenvoudig is.

Afbeelding 4. Selecteer een map en toon folderiteminformatie
Deze materie is door Microsoft uitstekend gedocumenteerd. Bezoek de website: http://msdn.microsoft.com
Klik in het linker menu achtereenvolgens op:
- User Interface Design and Development
- Windows Shell
- Shell Reference
- Shell Objects for Scripting and Microsoft Visual Basic
- Shell
Onder het hoofdstuk ‘Shell Objects for Scripting and Microsoft Visual Basic’ treft u uitgebreide beschrijvingen aan van een nog groter aantal objecten. Hierbij kunt u denken aan DiskQuotaControl of het Shell-LinkObject. Daarnaast valt op te merken dat voor de sommige functies de minimum versie van shell32.dll varieert. De hier besproken functionaliteit zou moe-ten werken vanaf versie 4.71; wat inhoudt dat minimaal Windows 95 met Internet Explorer 4 geïnstalleerd moet zijn. Ik ben echter ook functies tegengekomen die minimaal 5.0 of zelfs 6.0 (Windows XP) eisen.