Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Eine simple UNZIP-Komponente programmieren

Geschrieben von: Christoph Wille
Kategorie: Komponenten

This printed page brought to you by AlphaSierraPapa

Im heutigen Artikel werden wir uns eine einfache Unzip Komponente selbst programmieren - mit Hilfe von frei erhältlichen Klassen-Bibliotheken und Visual C++. Selbst wenn man nicht daran interessiert ist, die vorgestellte Komponente zu erweitern - der Download enthält die fertige Komponente, die man nur noch am eigenen Server registrieren muß!

In diesem Artikel verwendet ich die MFC Zip Bibliothek von Tadeus Dracz. Die aktuelleste Version kann man sich bei CodeGuru downloaden.

Voraussetzungen

Die Grundvoraussetzung um den hier vorgestellten Sourcecode zu modifizieren und zu erweitern ist ein installiertes Visual C++ 6.0 oder höher. Ich werde auf einige Details des Komponenten-Erstellens in Visual C++ eingehen, und wer möchte, kann anhand der Anleitung die Komponente selbst nachbauen.

Die fertig kompilierte DLL ist Teil des Downloads, ebenso wie der Sourcecode.

Das Projekt erstellen

Der Code der Zip Bibliothek ist mit Hilfe der MFC (Microsoft Foundation Classes) geschrieben worden, deshalb habe ich mich aus Einfachheitsgründen entschieden, die Komponente ebenso mit Hilfe der MFC zu erstellen. Dazu wähle ich im Projekt-Wizard das MFC DLL Projekt aus, vergebe einen Namen, und kann dann folgende Einstellungen treffen:

Die wichtigste Einstellung für uns ist, daß unsere DLL Automation unterstützen muß, weil sonst können wir keine COM Komponenten einbauen. Da die Zip Bibliothek dynamisch zur MFC linkt, sollte man der Einfachheit halber den selben Weg gehen.

Das Projekt wird jetzt für uns erstellt, allerdings sind noch keine Komponenten im Projekt (es ist also eine leere Hülle). Um nun eine Komponente hinzuzufügen, wählen wir New Class vom Kontextmenü des Projekts:

Jetzt beginnt der Spaß - die richtigen Einstellungen für die Klasse sind gefragt. Der folgende Screenshot zeigt meine Auswahl:

Wichtig ist die Basisklasse CCmdTarget, da diese die Unterstützung für Automation enthält. Weiters sollte man unter keinen Umständen vergessen, die ProgId zu generieren - in unserem Falle ist es ZipCOM.SimpleZip.

Das Skelett erstellen

Wir haben zwar nun eine COM Komponente, allerdings mit exakt Null Funktionalität. Daher muß unser nächster Schritt sein, die Funktionen für SimpleZip zu deklarieren:

Wer in den "guten alten Zeiten" händisch COM Interfaces und Methoden deklariert hat (inklusive IDL vielleicht), der wird den MFC ClassWizard schätzen, der uns das Hinzufügen in einem eigenen Tab ermöglicht:

Als Beispiel des Erstellens habe ich die Methode Open herausgegriffen. Dabei gibt es eigentlich kaum Spielraum, weil alle auswählbaren Datentypen vorgeben sind.

Wenn man alle drei Methoden eingegeben hat, sieht der Automation Tab wie folgt aus:

Ein Klick auf OK, und die Skelette der drei Funktionen werden für uns generiert.

Funktionalität einbauen

Bevor man selbst Code schreibt, muß man noch die Zip Bibliothek einbinden. Dazu gibt es mehrere Verfahrensweisen, die alle auf der Downloadseite der Bibliothek beschrieben sind. Ich bin den Weg des Einbindens des Zip Projekts in das Komponentenprojekt gegangen, da dies einiges an Kopieraufwand von Libraries erspart.

Die ersten Änderungen sind in der Headerdatei SimpleZip.h vorzunehmen - man muß zur Datei ZipArchive.h linken. Für mein lokales Projekt war das (je nach Installation des Bibliothekprojekts muß man diesen Pfad ändern):

#include "..\UnZip\ZipFunc\ZipArchive.h"

Weiters habe ich noch eine Membervariable deklariert, die das Zip Archiv repräsentiert (ich habe leider nicht den Platz, detailliert auf die Funktionalität dieser Klasse einzugehen, aber man kann mit dieser so ziemlich alles "anstellen"):

protected:
   CZipArchive m_zip;

Der Sourcecode für die drei Methoden ist absolut straight-forward, es sind im Prinzip nur Aufrufe in die Instanz des CZipArchive Objekts:

BOOL CSimpleZip::Open(LPCTSTR lpszZipFilename) 
{
  m_zip.Open(lpszZipFilename, CZipArchive::open, 0 );
  return TRUE;
}

BOOL CSimpleZip::Close() 
{
  m_zip.Close();
  return TRUE;
}

BOOL CSimpleZip::Unzip(LPCTSTR lpszFilename, LPCTSTR lspzTargetDirectory) 
{
  int nIndex = m_zip.FindFile(lpszFilename,false);
  if (-1 == nIndex) return FALSE;

  bool bResult = m_zip.ExtractFile(nIndex,lspzTargetDirectory);

  if (true == bResult) return TRUE;

  return FALSE;
}

Damit haben wir den fertigen Sourcecode. Man muß die Komponente nun nur noch kompilieren und registrieren, um sie testen zu können. Ich gehe davon aus, daß C++ Programmierer das mit links schaffen.

Testen

Der Download des heutigen Artikels beeinhaltet ein Testarchiv demo.zip sowie die dazugehörige ASP Datei unzip.asp. Diese verwendet unsere SimpleZip Komponente:

<%
Response.Expires = 0

Set objZip = Server.CreateObject("ZipCOM.SimpleZip")
strZipFile = Server.MapPath("/demo.zip")

bResult = objZip.Open(strZipFile)
bResult = objZip.Unzip("pic001.jpg", "c:\temp\")
bResult = objZip.Close()
Response.Write "Done"
%>

Der Code zur Verwendung der Komponente ist absolut straight-forward. Ich hoffe, Euch gefällt das Bild!

Schlußbemerkung

Der heutige Artikel war ein verkürzter Überblick über die Erstellung einer Komponente mit Visual C++. Allerdings haben wir mit sehr geringem Programmieraufwand eine einfache Zip Komponente erstellt, die man auch ohne weiteres ausbauen kann - neue Archive erstellen, Dateien zippen, ganze Archive automatisch entzippen, und so weiter.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001113.zip

Verwandte Artikel

Web-basiertes Dateimanagement mit dem ASP FileMan
http:/www.aspheute.com/artikel/20010507.htm
Zippen und entzippen von Dateien
http:/www.aspheute.com/artikel/20001005.htm

Links zu anderen Sites

Zip Bibliothek
http://codeguru.earthweb.com/cpp_mfc/ZipFunc.shtml

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.