czwartek, 21 stycznia 2010

Biblioteka COM napisana w VB.NET domowym sposobem

Każdy kto pisze bardziej zaawansowane projekty w języku VBA wie co to biblioteka zewnętrzna poszerzająca możliwości piszącego aplikację. Dodaje się je za pomocą referencji w projekcie lub też korzysta z plików widocznych w rejestrze Windows. W pewnym momencie dochodzimy do takiego momentu że sami chcielibyśmy utworzyć taką bibliotekę  zawierającą nasze ulubione funkcje, jakieś elementy które chcemy ukryć przed wścibskimi oczami osób postronnych lub chcemy dodać funkcjonalności nigdzie indziej nie dostępne.
Niezależnie od powodów które nami kierują musimy wiedzieć co nam będzie potrzebne do zrealizowania naszego małego projektu. Narzędzia które wymienię są darmowe i osiągalne bez problemu w internecie.

Do pisania samego kodu możemy użyć darmowego kompilatora Visual Basic 2008 Express Edition. Tu niestety będziemy mieli małą niedogodność, gdyż to co chcemy napisać nie jest osiągalne w szablonach tej wersji. To akurat nie jest aż tak duży problem gdyż szablon  kodu klasy jest dostępny na stronie Microsoft wraz z opisem jak przygotować taki plik ale tu uwaga w pełnej wersji Visual Studio - http://support.microsoft.com/kb/817248/pl

Kolejnym narzędziem jakiego będziemy potrzebować jest generator identyfikatorów GUID. - http://www.guidgenerator.com/online-guid-generator.aspx - dzięki niemu nasza klasa będzie miała unikalne identyfikatory, które ręcznie sobie przekleimy do kodu.

Ostatnim elementem jaki będzie nam potrzebny to plik Regasm.exe - jest to narzędzie umożliwiające wygenerowanie pliku tlb niezbędnego w procesie linkowania w projekcie VBA. Nie jest ono obecne we frmeworku 3.5 i niestety musimy posiłkować się plikiem obecnym w wersji 2.0. Jeżeli jej nie posiadamy możemy sobie ją ściągnąć ze strony Microsoft np. z tego adresu.

Samo wygenerowanie pliku DLL z szablonu może odbyć się zarówno z poziomu Visual Basic 2008 Express jaki kompilatora VBC.EXE. bardziej złożone jest natomiast generowanie pliku tlb - gdyż potrzebne są do tego uprawnienia administratora. W systemie Windows Vista i Windows 7 tryb taki uzyskamy poprzez wykorzystanie opcji "Uruchom jako administrator", starsze systemy jak Winxows XP nie potrzebują takiego trybu uruchamiania, wystarczy posiadani praw lokalnego administratora.

Proces generowania pliku tlb jest niezwykle prosty i wymaga jedynie uruchomienia komendy:
regasm.exe biblioteka.dll /tlb:biblioteka.tlb
gdzie biblioteka.dll to plik który otrzymamy po kompilacji kodu. Dla ułatwienia pracy napisałem bardzo prosty skrypt kompiluj.cmd:
@ECHO OFF
PATH = C:\Windows\Microsoft.NET\Framework\v3.5;C:\Windows\Microsoft.NET\Framework\v2.0.50727;c:\Windows\System32
Vbc.exe /out:%~n1.dll /target:library %1
regasm.exe %~n1.dll /tlb:%~n1.tlb
którego wyżej wymieniony kod umieszczamy w pliku kompiluj.cmd, a następnie możemy wywołać za pomocą polecenia:
kompiluj.cmd Funkcje.vb
gdzie Funkcje.vb to nazwa pliku z kodem źródłowym biblioteki którą chemy skompilować a natępnie zarejestrować oraz stworzyć plik tlb.

UWAGA: nazrędzie regasm.exe rejestruje odrazu bibliotekę w systemie

Kod pliku Funkcje.vb
Imports System.Net
Imports System.IO
Imports System.Text

<ComClass(Funkcje.ClassId, Funkcje.InterfaceId, Funkcje.EventsId)> _
Public Class Funkcje

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "3d0185c0-5b91-4222-b09e-3076d0c3721f"
    Public Const InterfaceId As String = "c41cb37e-388d-4f27-aba2-1b8843bb207a"
    Public Const EventsId As String = "c2688582-7bc2-4376-a83a-bf4d0add3ce2"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

    Public Function test() As Boolean
        Return True
    End Function

End Class

Kolejnym krokiem jest dodanie referencji tak stworzonej biblioteki do projektu VBA. Możemy skorzystać z utworzonego pliku tlb lub wybrać z listy referencji dostępnych w systemie. Przykładowy kod VBA dozamieszczonego przykładu wyglądał by w następujący sposób:
Sub test_com_in_net()
Dim r As New Funkcje.Funkcje
On Error GoTo ERR_Handler
    Set r = New Funkcje.Funkcje
    Debug.Print r.test
Exit Sub

ERR_Handler:

Debug.Print err.Number, err.Description

End Sub

Brak komentarzy:

Prześlij komentarz