Eine simple UNZIP-Komponente programmieren
Geschrieben von: Christoph Wille 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. VoraussetzungenDie 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 erstellenDer 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 erstellenWir 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 einbauenBevor 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. TestenDer 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ßbemerkungDer 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Web-basiertes Dateimanagement mit dem ASP FileMan Links zu anderen SitesWenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |