ASP en COM
Door Tim Musschoot
25 september 2001
1. Inleiding
Met de huidige evolutie van het internet gaan steeds meer softwareproducenten hun software toegankelijk maken
via het internet. De technologie die dit toelaat heeft niet stil gestaan. Denken we maar aan de opkomst van webgebaseerde technologieën zoals ASP
en de nieuwe ASP.NET technologie van Microsoft. Een ervaren ontwikkelaar die de migratie van zijn software naar
een webgebaseerd softwarepakket wenst te maken wil natuurlijk zoveel mogelijk
zijn bestaande denkwijze en realisaties behouden. De standaardmogelijkheden van ASP zijn zeer beperkt. Er is een eenvoudige
vorm van scripting aanwezig, maar deze voldoet nauwelijks aan de
behoeftes. Een mogelijkheid om bestaande code te importeren is al helemaal uit den boze.
Een oplossing voor dit probleem wordt aangeboden door de mogelijke
integratie van COM objecten in een ASP pagina. Een gedetailleerde omschrijving van wat COM nu eigenlijk allemaal inhoud
valt buiten het bestek van dit artikel. Meer info kunt u vinden op het internet.
Wat we dienen te weten is dat een COM object een bepaalde ‘enveloppe’ is waarin de business logic van uw software kan worden gestoken.
2. Het waarom van COM objecten
In de laatste maanden kreeg ik regelmatig de vraag van andere ontwikkelaars hoe men een complex login systeem
dat gebruikt maakt van databases en encryptiealgoritmes of Kerberos
authenticatie in een website kan inbouwen. Dit is één van de mogelijkheden van de COM technologie.
Het bestaande authentiseringsysteem van uw applicatie of van uw netwerk kan gebruikt worden binnen een ASP pagina.
Een simpel voorbeeld vindt u verder in dit artikel.
Een meer theoretische benadering van de COM aanpak heeft zijn oorsprong in de software ontwikkeling.
Daar heeft de ervaring geleerd dat de meest interessante manier om een complex probleem te implementeren gebruik maakt van
een 3-lagen model. De oplossing voor het probleem wordt opgedeeld in 3 gebieden.
Deze zijn:
- Interface: wat de gebruiker ziet
- Business Logic: alle bedrijfsprocessen en hun interacties
- Data layer: het database gedeelte.
Deze aanpak is zo interessant omdat op die manier veranderingen in één van de lagen beperkt blijven tot die laag en eventueel een
klein gedeelte van de volgende laag. Als men bijvoorbeeld een aanpassing doet aan de database organisatie
dient men niet het volledige programma aan te passen, maar volstaat een lichte
aanpassing van de business objecten die de data uit de database ophalen.
De functionaliteiten die deze bieden aan de interface van het programma blijven onveranderd.
Meer hierover kunt u lezen in het boek “Thinking in C++” en talloze andere papers over de principes van Software Engeneering.
Wanneer u deze denkwijze doorzet naar het maken van websites, dient de website enkel als interface naar de
functionaliteit van uw programma toe. Het is dus overbodig werk om opnieuw alle bedrijfsprocessen te gaan
implementeren in uw website. Dit kan gemakkelijk verwezenlijkt worden door het gebruik van COM objecten. Deze zullen
alle functionaliteit bevatten, en de website zal deze gaan gebruiken om met de
gebruiker te communiceren. Op deze manier zullen verandering in de bedrijfslogica niet automatisch de aanpassing
van de website met zich meebrengen.
Een mogelijk nadeel van COM is het feit dat de instantiatie van de objecten in een ASP pagina enige overhead
met zich meebrengt. De vraag die men zich daar tegenover kan stellen is: "Wat werkt het best: volledige vertaling
van uw business logic naar een web scripting taal (vbscript of jscript in ASP),
waarbij de uitvoering over een interpreter loopt, of een COM object dat veel efficiënter voor uitvoering van code zorgt, maar een lichte overhead door zijn
initialisatie heeft?"
3. Een COM object aanmaken en in uw ASP pagina gebruiken
In dit artikel maken we gebruik van Microsoft Visual C++ 6.0 om het object aan te maken.
De volledige source code volgt op het einde. Ter demonstratie maken we een
eenvoudig object aan dat twee functies ondersteunt: Validatie van een
gebruiker, en het ophalen van een String.
3.1 Aanmaak van het object
Voor de aanmaak van COM objecten en de verschillende opties die u hierbij hebt wordt verwezen naar de
verschillende boeken die dit onderwerp behandelen. In deze paragraaf wordt enkel een snelle beschrijving gegeven hoe
het object werd aangemaakt. Om zelf dergelijke objecten te kunnen aanmaken is kennis van Visual C++ (zoals in dit
document) of Visual Basic noodzakelijk.
Om een nieuw COM object aan te maken onderneemt u volgende stappen:
- Start een nieuw project (File | New … | Projects)
- Kies een project van het type "ATL COM AppWizard"
- Vul een naam en locatie voor het project in en klik op OK. (in ons voorbeeld werd “mycom” als naam gekozen)
- Kies voor Server Type: DLL, geen enkele optie wordt aangevinkt.
- Het project wordt voor u aangemaakt als u op Finish klikt.
- U kiest "Insert | New ATL Object …." om een nieuw object aan te maken binnen uw project
- Kies voor een "Simple Object"
- Vervolgens vult u de naam van het object in. In ons voorbeeld werd voor de naam
CMessageObj gekozen. Vervolgens klikt u op OK.
- Aan de ICMessageObj Interface werden volgende methods toegevoegd:
- HRESULT GetMessage([out, retval] BSTR* Str);
- HRESULT ValidateUser([in] BSTR* Name, [in] BSTR* Passwd, [out, retval] VARIANT_BOOL * IsValid);
- Deze methods werden als volgt geïmplementeerd:
STDMETHODIMP CCMessageObj::GetMessage(BSTR *Str)
{
*Str = _bstr_t("COM says hello!");
return S_OK;
}
STDMETHODIMP CCMessageObj::ValidateUser(BSTR *Name, BSTR
*Passwd, VARIANT BOOL *IsValid)
{
_bstr_t Nm(*Name,false);
_bstr_t Pass(*Passwd,false);
if((Nm==_bstr_t("login"))&&(Pass==_bstr_t("password")))*Is Valid
=true ;
else Is Valid = false;
return S_OK;
}
Na compilatie werd het volgende bestand bekomen: "mycom.dll". Dit bestand is de DLL met de
functionaliteit die we wensen te gebruiken.
3.2 Integratie en gebruik in een ASP pagina
Om uw object te kunnen gebruiken dient u de DLL eerst te registreren bij Windows.
Daarvoor kunt u de DLL laten staan in de directory waar hij staat, maar het is aan
te raden hem naar de Windows system-directory te kopiëren. Wanneer u dit gedaan hebt
registreert u de DLL met dit commando onder de command prompt:
Regsvr32.exe %windir%\system\mycom.dll
Indien u een zelfgemaakt object wenst te registreren vervangt u ‘mycom.dll’ door de naam van uw object.
In de volgende stap wensen we het object en zijn functionaliteiten te gebruiken in een asp pagina.
<%@ LANGUAGE=VBSCRIPT%>
<html>
<head>
<title>ASP en COM voorbeeld</title>
<body>
<%
Dim MyObj
Set MyObj = Server.CreateObject("mycom.CMessageObj")
Dim Str
Str = MyObj.GetMessage()
Response.Write(Str)
Set MyObj = Nothing
%>
</body>
</html>
De creatie van een instantie van een COM object in een ASP pagina gebeurt door de functie
object Server.CreateObject(<COM object name>) aan te roepen. De naam van het COM object bestaat uit de naam van het geregistreerde object (in ons geval de DLL) en de naam van het object
binnen deze DLL. De return waarde is een referentie naar het object.
Met deze referentie kunnen we nu de gewenste functionaliteiten gaan oproepen die we wensen.
Dit gebeurt door de naam van de gewenste functie van het object op te
roepen:
MyObj.GetMessage()
Het returntype is een String, analoog met het returntype dat we in het object hebben gespecifieerd.
Bij het oproepen van een object member functie van een COM object is het natuurlijk ook mogelijk om argumenten mee te geven.
In het volgende voorbeeld wordt een simpel login form getoond waarin de gebruiker zijn loginnaam en paswoord dient in te
vullen. Deze worden dan via de CMessageObj::ValidateUser() functie
gevalideerd. De manier waarop dit gebeurt is volledig onzichtbaar voor de ASP programmeur.
Eveneens hoeft deze de database lay-out van de applicatie niet te kennen.
<%@ LANGUAGE=VBSCRIPT%>
<% Response.Buffer = true%>
<html>
<head>
<title> ASP en COM login voorbeeld</title>
<body>
<%
Dim Message
Message = ""
If(Request.Form("filled") = 1) Then
Dim MyObj
Set MyObj = Server.CreateObject("mycom.CMessageObj")
If MyObj.ValidateUser(Request.Form("name"),Request.Form("password"))Then
Response.Clear
Response.Write "Congratulations, Login successfull !"
Else
Response.Clear
Respons.Write "Login Failure !"
Response.Write "<a href='com_login.asp'>Retry</a>"
End If
Else
%>
<%
End If
%>
4. Functionaliteiten
De functionaliteit beperkt zich uiteraard niet enkel tot het ophalen van strings en valideren van
gegevens. Ieder probleem dat een oplossing heeft kan via COM in uw website worden geïntegreerd.
De complexiteit van het maken van een website wordt op deze manier herleid tot het aanroepen van de correcte object
member functies. Enkele vaak gebruikte toepassingen van COM zijn:
- Collection Classes : bouw uw eigen collecties met bvb strings, integers, …
- Encryptie : encryptie kan niet of moeilijk via scripting gebeuren
- Database Recordsets : maak uw eigen recordsets zodat de website ontwerper de database lay-out niet hoeft te kennen.
- Gebruikersbeheer
- Remote NT login
- Gebruik van externe technologieën: XML parsers, PDF converters, …
- ASP Componenten : ASP Mail, ASP Upload, …
5. Broncode
De broncode van dit paper is samen met het COM object en de ASP voorbeelden te vinden in dit bestand.
copyright 2001 Tim Musschoot
|