Tajemnicza klasa WizHook. Ukryte możliwości Accessa 
(dotyczy Acc2000, AccXP).

Na początek informacja jak znaleźć klasę WizHook?

O, to żaden problem. Jest ona zawarta w standardowej bibliotece Accessa (patrz referencje) - wymaganym elemencie każdej bazy.
Zresztą... Nie musimy się troszczyć o odwołania, bo tej referencji nie da się wyłączyć.

Aby zobaczyć pełną listę funkcji zawartych w klasie WizHook, należy otworzyć dowolny moduł i nacisnąć F2. Wywołany zostanie Object Browser, ale to jeszcze nie wszystko... Teraz naciskamy prawym przyciskiem myszy i wybieramy 'Show Hidden Members' i dopiero wtedy możemy odszukać nasza klasę WizHook.

I co widzimy... Ależ bogactwo funkcji! I to takich, że przecież zawsze nam ich brakowało:

Pamiętamy, ile trzeba było kombinować, żeby rzetelnie sprawdzić, czy dany plik istnieje. Dir(...) ze swoimi pułapkami zostawiał co najmniej niedosyt, a tu wystarczy WizHook.FileExists(File As String) i po kłopocie. 

Następne nazwy funkcji zapowiadają jeszcze większe emocje! Gorączkowo zabieramy się do testowania pierwszej, najprostszej funkcji, jaką tam znaleźliśmy: WizHook.CurrentLangID() i... z wielkim zawodem widzimy 0. Potem sprawdzamy WizHook.AccessUserDataDir(), WizHook.FileExists("C:\Autoexec.bat") i znów rozczarowanie. Te funkcje nie działają...?

Okazuje, się, że Microsoft ustawił jeszcze jedną barierę w dostępie do tych funkcji.  One po prostu są uśpione, trzeba je obudzić! W bajkach trzeba było całować księżniczki, tutaj sposób jest nieco bardziej prozaiczny - musimy mieć specjalny klucz, który pozwoli nam wejść do tajemniczego świata tej nieodkrytej klasy. Skąd wziąć ten klucz?

Szczęśliwie znalazł go pewien francuski 'Utter Access Enthusiast' (skrol29@freesurf.fr), i ogłosił to w wątku na stronie http://www.utteraccess.com.
Oto ten klucz:
WizHook.Key = 51488399

Wystarczy podać go na początku naszego kodu i funkcje z klasy WizHook zostaną uaktywnione!

Oto przykłady użycia niektórych z tych funkcji:

'Sprawdza, czy dany plik istnieje
Function CzyPlikIstnieje(Plik As String) As Boolean
    WizHook.Key = 51488399 'jeśli funkcje zostały 
    'odblokowane już wcześniej - można klucz pominąć
    CzyPlikIstnieje = WizHook.FileExists(Plik)
End Function
'Sprawdza, czy istnieje procedura o podanej nazwie
Function CzyIstniejeProc(strName As String)
    WizHook.Key = 51488399
    CzyIstniejeProc = WizHook.GlobalProcExists(strName)
End Function
'Zapisuje określony obiekt accessowy.
'Wartościami AcObjectType mogą być:
'Const acForm = 2
'Const acMacro = 4
'Const acModule = 5
'Const acQuery = 1
'Const acReport = 3
'Const acTable = 0 (itd.)
Sub ZapiszObiekt(ObjName As String, ObjType As AcObjectType)
    WizHook.Key = 51488399
    WizHook.SaveObject ObjName, ObjType
End Sub
'Sortuje zmienną tablicową
Public Function Sortuj()
Dim a(1 To 4) As String
    a(1) = "ddd"
    a(2) = "bbb"
    a(3) = "ccc"
    a(4) = "aaa"
    WizHook.SortStringArray a()
    'Procedura SortStringArray wyjątkowo nie wymaga 
    'podania klucza WizHook.Key
    Debug.Print a(1), a(2), a(3), a(4)
    'Otrzymamy: aaa, bbb, ccc, ddd
End Function
'Rozbija ścieżkę na poszczególne składniki
Function RozbijSciezke(sPath As String)
Dim sDrive As String, sDir As String, sFile As String, sExt As String
    WizHook.Key = 51488399
    WizHook.SplitPath sPath, sDrive, sDir, sFile, sExt
    Debug.Print sDrive, sDir, sFile, sExt
    'dla RozbijSciezke("C:\BAZY\Dane1.mdb"), otrzymamy:
    'sDrive = "C:" 
    'sDir = "\BAZY\"
    'sFile = "Dane1"
    'sExt = ".mdb"
End Function
'Wylicza pełną ścieżkę na podstawie ścieżki względnej
'w stosunku do bieżącego katalogu
Function Sciezka(RelativePath As String)
Dim FullPath As String
    WizHook.Key = 51488399
    Call WizHook.FullPath(RelativePath, FullPath)
    Sciezka = FullPath
End Function
'Przykładowo, jeśli bieżącym katalogiem jest C:\Bazy\Mdb\Arch\,
'to Sciezka("..\Dane\") zwróci nam:
'C:\Bazy\Mdb\Dane\
'Zwraca ścieżke do accessowego katalogu użytkownika, np:
'C:\WINDOWS\Profiles\Uzytkownik1\Dane aplikacji\Microsoft\Access\
WizHook.Key = 51488399
WizHook.AccessUserDataDir()
'Zwraca ścieżke do katalogu, w którym instalowane są dodatki AddIns
WizHook.Key = 51488399
WizHook.OfficeAddInDir()
'Zwraca identyfikator używanego języka,
'np. jęz. polski ma ID = 1045
WizHook.Key = 51488399
WizHook.CurrentLangID()
'Zwraca informację, czy Tabela1 ma klucz unikalny na polu Id
WizHook.Key = 51488399
WizHook.TableFieldHasUniqueIndex("Tabela1", "Id")
'Zakłada hasło na projekt VBA.
'Jest to jedyny (znany mi) sposób, który umożliwia 
'założenie hasła na projekt VBA z poziomu kodu!
WizHook.Key = 51488399
If WizHook.SetVbaPassword("C:\BAZY\Db1.mdb", "", "aaa") = True Then
    MsgBox "Założono hasło 'aaa' na projekt VBA w bazie C:\BAZY\Db1.mdb."
End If

K. P.