2 bibiotheken

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
20.559
Wil je in VBA wat doen met folders. subfolders en files, dan kun je gebruik maken van 2 verschillende bibliotheken:
microsoft scripting runtime: ..\..\scrrun.dll
en
microsoft host scripting object model: ..\..\wshom.ocx

Deze bibliotheken bevatten verschillende subbibliotheken, zoals de 'dictionary' en 'network'
Beide bevatten de subbibliotheek 'filesystemobject'.

Ale je 'late binding' wil gebruiken voor zo'n (sub)bibliotheek gebruik je voor scripting runtime
Code:
with createobject("scripting.filesystemobject")
of
with createobject("scripting.dictionary")

Voor host scripting object model::
Code:
with createobject("wscript.network")
of
with createobject("wscript.shell")

Maar..... in deze hsom-bibliotheek funktioneert niet:
Code:
with createobject("wscript.filesystemobject")

Ik ben op zoek naar de 'late binding' code die de filesystemobject subbibliotheek in het host scripting object model aanroept.

De code
Code:
with createobject("scripting.filesystemobject")
zoek ik niet, want die roept scripting runtime aan.
 
Laatst bewerkt:
Dit is wat ChatGPT zegt.
Of het klopt, geen idee. Dus don’t shoot the messenger.

De reden dat CreateObject("WScript.FileSystemObject") niet werkt, is dat er in Microsoft Windows Script Host Object Model (wshom.ocx) helemaal geen COM-class bestaat met die ProgID.
De situatie is eigenlijk:
BibliotheekProgIDCOM-class
Microsoft Scripting Runtime (scrrun.dll)Scripting.FileSystemObjectFileSystemObject
Microsoft Scripting Runtime (scrrun.dll)Scripting.DictionaryDictionary
Windows Script Host Object Model (wshom.ocx)WScript.NetworkNetwork
Windows Script Host Object Model (wshom.ocx)WScript.ShellShell
De FileSystemObject behoort dus uitsluitend tot scrrun.dll (Microsoft Scripting Runtime) en niet tot wshom.ocx.
Daarom is dit correct:
Code:
Dim fso As Object

Set fso = CreateObject("Scripting.FileSystemObject")
En dit bestaat niet:
Set fso = CreateObject("WScript.FileSystemObject") ' fout
De verwarring ontstaat vaak doordat in VBScript je soms ziet:
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Maar hier is:
  • WScript = het host-object van Windows Script Host;

  • CreateObject = een methode van dat host-object;

  • "Scripting.FileSystemObject" = nog steeds de COM-class uit scrrun.dll.
Met andere woorden:
WScript.CreateObject("Scripting.FileSystemObject")
maakt exact dezelfde FSO aan als:
CreateObject("Scripting.FileSystemObject")
Er bestaat geen alternatieve ProgID binnen de WSH Object Model-bibliotheek voor FileSystemObject. Als je late binding wilt gebruiken voor FSO, dan is:
CreateObject("Scripting.FileSystemObject")
de enige juiste COM-aanroep. De implementatie komt altijd uit scrrun.dll, ook wanneer je code draait onder Windows Script Host.

Nog een kleine aanvulling die handig kan zijn bij het uitpluizen van COM-bibliotheken in VBA:
Je kunt de beschikbare ProgID's vaak terugvinden in het register onder HKEY_CLASSES_ROOT of inspecteren met hulpmiddelen zoals OLE/COM Object Viewer van Microsoft. Dan zie je direct welke classes een bibliotheek daadwerkelijk exposeert. Bij wshom.ocx zul je onder andere WScript.Shell en WScript.Network vinden, maar geen WScript.FileSystemObject.

Kort samengevat:
  • Scripting.FileSystemObject → afkomstig uit scrrun.dll
  • Scripting.Dictionary → afkomstig uit scrrun.dll
  • WScript.Shell → afkomstig uit wshom.ocx
  • WScript.Network → afkomstig uit wshom.ocx
  • WScript.FileSystemObject → bestaat niet

Dus voor FSO, zowel bij early binding als late binding, kom je altijd uit bij de Microsoft Scripting Runtime.
 
Wat niet juist is, want bij early binding:

Code:
With New IWshRuntimeLibrary.FileSystemObject

werkt juist wel.

De code voor scripting runtime is:

Code:
With New Scripting.FileSystemObject
 
Terug
Bovenaan Onderaan