ASPNL logo (1 kb)
zaterdag 17 mei 2008




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

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:
  1. Start een nieuw project (File | New … | Projects)
  2. Kies een project van het type "ATL COM AppWizard"
  3. Vul een naam en locatie voor het project in en klik op OK. (in ons voorbeeld werd “mycom” als naam gekozen)
  4. Kies voor Server Type: DLL, geen enkele optie wordt aangevinkt.
  5. Het project wordt voor u aangemaakt als u op Finish klikt.
  6. U kiest "Insert | New ATL Object …." om een nieuw object aan te maken binnen uw project
  7. Kies voor een "Simple Object"
  8. Vervolgens vult u de naam van het object in. In ons voorbeeld werd voor de naam CMessageObj gekozen. Vervolgens klikt u op OK.
  9. 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);
  10. 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.

<!-- COPYRIGHT 2001 Tim Musschoot -->
<%@ 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.

<!-- COPYRIGHT 2001 Tim Musschoot -->
<%@ 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
%>
<!-—html form code -->
<%
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

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL