Komfortabler Dateimanager mit vielen Funktionen

SpeedCommander 12.30

By Sven on 29.09.2008 - 10:00 in SpeedCommander 12 with 3 Kommentare

SpeedCommander 12.30 ist fertig und kann ab sofort heruntergeladen werden. Neue Funktionen und behobene Fehler sind im Anwenderforum aufgelistet. Die Zahlen in den eckigen Klammern am Ende jeder Zeile kennzeichnen den entsprechenden Eintrag im TFS, der mir damit auch die jeweiligen Änderungen im Quellcode anzeigen kann. Sofern die Fehler und Anregungen im Forum berichtet wurden, kann man in der Forumssuche auch gezielt nach diesen Werten suchen.

Es geht voran

By Sven on 17.09.2008 - 10:00 in Alltägliches with 11 Kommentare

Kurzer Zwischenbericht von der Archiver-Front. Angefangen hatte ich mit dem ARJ, da dieser recht kompakt ist und ich den Quellcode schon vor einiger Zeit für ein besseres Verständnis etwas umformatiert hatte. Zuerst wollte ich ja nur die Fehlerausgaben präzisieren sowie auf lange Pfade umstellen. Ziemlich schnell merkte ich aber, dass in den Archiver eine Menge Einsparpotential bzgl. der Codezeilen liegt.

Die einzelnen Archivobjekte (ARJ, SQX, …) sind von einem allgemeinen Archivobjekt abgeleitet, das allgemeine Verwaltungsfunktionen (z.B. für Erstellung und Sortierung von Dateilisten) für alle Archiver implementiert. Die einzelnen Archivoperationen werden aber größtenteils von jedem Archiver selbst implementiert. Beim Hinzufügen von Dateien zu einem Standardarchiv sind das z.B. folgende Aufgaben:

  1. Logging starten 
  2. Sichern der ZoneID des Archivs (falls vorhanden)
  3. Erstellen von Dateilisten
  4. Auflisten der im Archiv enthaltenen Dateien
  5. Erstellung einer neuen Archivdatei
  6. Kopieren des SFX-Stubs (falls vorhanden) in die neue Archivdatei
  7. Unberührte Dateien aus dem alten Archiv in das neue Archiv kopieren
  8. Neue Dateien in das neue Archiv komprimieren
  9. Altes Archiv löschen
  10. Neues Archiv auf den bisherigen Archivnamen umbenennen
  11. ZoneID des Archivs wiederherstellen (falls vorhanden)
  12. Optional einen erweiterten Vergleich zwischen originalen und komprimierten Daten durchführen (ZIP und SQX)
  13. Logging beenden

Wenn man sich die Liste so anschaut, dann sind eigentlich nur die Punkte 4 und 8 vom jeweiligen Archiver abhängig. Ähnliche Abläufe ergeben sich auch für alle anderen Archivfunktionen (z.B. Entpacken und Löschen).

Es lag also nahe, die grundlegenden Funktionen in das allgemeine Archiverobjekt zu stecken und nur die speziellen in das für das jeweilige Format zuständige. Die einzelnen Archiver-Dlls werden dadurch zwar nicht kleiner, allerdings sind die allgemeinen Funktionen nur noch einmal vorhanden. Das erleichtert die Codepflege und die Fehlerbehebung erheblich.

Mittlerweile bin mit ARJ, SQX und ZIP so ziemlich durch. Mit den anderen Archivern wird es jetzt vermutlich etwas einfacher werden, da die allgemeinen Funktionen jetzt alle implementiert sind.

Archiver

By Sven on 03.09.2008 - 10:00 in Alltägliches with 5 Kommentare

In der nächsten Zeit wird es hier im Blog wahrscheinlich etwas ruhiger werden. Grund dafür sind größere Umbauarbeiten am Server an den Archivern, die sehr arbeitsintensiv sind und wohl auch einige Zeit dauern werden. Im Mittelpunkt steht die Unterstützung von langen Dateinamen (bis zu 32000 Zeichen) beim Entpacken und Komprimieren.

Ein weiterer Schwerpunkt sind die Fehlermeldungen. Rainer hat damals mit Vorliebe den Universalfehler „Zugriff verweigert“ verwendet, wenn es beim Öffnen oder Erstellen einer Datei ein Problem gab. Nach der Umstellung meiner Projektstruktur wollte ich z.B. ein Installations-SFX erzeugen, als Fehlermeldung wurde nur „Der Zugriff auf eine Datei wurde vom System verweigert.“ angezeigt. Erst nach einer Debugsitzung war klar, dass der Archiver über den nicht mehr aktuellen Pfad der Symboldatei gestolpert war. Dem Anwender (und mir) wäre natürlich mehr geholfen, wenn bei der Fehlerausgabe der Name der Symboldatei zusammen mit der Fehlermeldung „Das System kann die angegebene Datei nicht finden.“ stehen würde.

Bei dieser Gelegenheit werde ich auch gleich den Quellcode an meine Vorlieben anpassen, sofern noch nicht geschehen. Das erleichtet das Verständnis für die eine oder andere Sache und hilft bei späteren Erweiterungen. Die Refactoring-Möglichkeiten von Visual Assist sind dabei eine große Hilfe.

15 Jahre

By Sven on 01.09.2008 - 10:00 in SpeedCommander 12 with 13 Kommentare

Heute vor 15 Jahren begann offiziell meine Selbständigkeit. Damals hatte keiner daran gedacht, dass mich das kleine Programm, das ich während des Studiums entwickelte, so lange durchs Leben begleiten würde. Und ein Ende ist im Moment auch nicht abzusehen.

Passend dazu gibt es im Betaforum eine neue öffentliche Betaversion (12.30.5475). Neu ist die Syntaxhervorhebung für PowerShell-Skripte in SpeedEdit. Einige kleine Fehler wurden auch wieder behoben.

Zertifikat verlängert

By Sven on 29.08.2008 - 10:00 in Alltägliches with 7 Kommentare

Gestern lief mein CodeSigning-Zertifikat ab. Schon letzte Woche hatte ich den Verlängerungsantrag per gelber Post an die deutsche GlobalSign-Vertretung Wiesinger & Schenk geschickt, am Mittwoch erhielt ich dann einen Tag vor Ablauf den neuen öffentlichen Schlüssel per eMail zugeschickt.

Die Aktualisierung des öffentlichen Schlüssels im Zertifikat gestaltete sich dank der zur Verfügung gestellten Batchdatei sehr einfach. Das alte Zertifikat muss vorher samt dem privaten Schlüssel aus der Zertifikatsverwaltung exportiert und als old.pfx gespeichert werden. Dazu gesellt sich dann noch der neue öffentliche Schlüssel als new.pem. Nach dem Aufruf der Batchdatei samt dreimaliger Eingabe des privaten Schlüssels wird das neue Zertifikat wieder in die Zertifikatsverwaltung importiert.

Das war’s auch schon. In drei Jahren gibt es dann den nächsten Bericht.

Symboldateien einzeln laden

By Sven on 27.08.2008 - 10:00 in Visual Studio 2008 with Keine Kommentare

Beim Debuggen von Memory-Dumps hat man meistens das Problem, dass die entsprechenden Windows-Symboldateien zum Snapshot des Anwenders nicht vorhanden sind. Letztlich muss eine Symboldatei immer genau zur jeweiligen Dll passen, damit der Debugger den Aufrufstack vernünftig anzeigen kann. Dank dem Microsoft-Symbolserver ist das aber kein großes Problem, der Debugger kann sich die passenden Symboldateien automatisch herunterladen.

Nachteilig ist, dass man keine Möglichkeit hat, die gewünschten Symboldateien auszuwählen. Startet man einen Dump mit aktiviertem Symbolserver, dann werden automatisch alle Symboldateien heruntergeladen, die zum jeweiligen Snapshot passen. Zudem lädt der Debugger auch noch die entsprechenden System-Dlls herunter, was natürlich entsprechend dauert.

Mit VS 2008 SP1 scheint Microsoft das Laden von Symboldateien erheblich vereinfacht zu haben. Gestern habe ich ein Kontextmenü entdeckt, das ich bisher noch nie gesehen hatte. Ich bin mir sicher, dass dieses Menü in der RTM-Version noch nicht enthalten war:

Symboldateien herunterladen

Nach Auswahl des Befehls wurde die passende Symboldatei für „kernel32.dll“ heruntergeladen und der Aufrufliste aktualisiert. Genial!

TFS: Warehouse-Aktualisierung

By Sven on 25.08.2008 - 10:00 in Kleine Tools, TFS with Keine Kommentare

Die TfsWarehouse-Datenbank enthält alle wichtigen Daten, die für die Generierung und Anzeige von Berichten nötig sind. Die Informationen stammen aus den operationalen Datenbanken (z.B. Arbeitsaufgaben, Versionskontrolle), sie werden durch den Warehouse-Webservice in die TfsWarehouse-Datenbank übertragen. Der TFSServerScheduler-Dienst sorgt dafür, dass dies stündlich geschieht. Allerdings läuft der Dienst wie berichtet nur auf einem an eine Domäne angeschlossenen Server.

Als Abhilfe habe ich mir ein kleines Programm geschrieben, welches die Aktualisierung der TfsWarehouse-Datenbank durch den Webservice anstößt. In Verbindung mit der Windows-Aufgabenplanung kann dies je nach Bedarf stündlich, täglich oder in anderen gewünschten Abständen geschehen. Optimaler wäre natürlich ein eigener Dienst, aber so schwer wollte ich es mir dann auch nicht machen.

// ****************************************************************************
// ******                     Implementation zu wWinMain                 ******
// ****************************************************************************
int APIENTRY wWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPWSTR /*lpCmdLine*/, int /*nCmdShow*/)
{
    // Internet-Session oeffnen
    HINTERNET hSession = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0);
    if (NULL != hSession)
    {
        // Verbindung herstellen
        HINTERNET hConnect = WinHttpConnect(hSession, L"localhost", 8080, 0);
        if (NULL != hConnect)
        {
            // Anforderung erstellen
            HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", L"/Warehouse/v1.0/warehousecontroller.asmx/Run", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
            if (NULL != hRequest)
            {
                // Anforderung senden
                BOOL fResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);

                // Anforderung wurde gesendet
                if (fResult && WinHttpReceiveResponse(hRequest, NULL))
                {
                    // Antwort abfragen
                    char szResponse[2048] = { 0 }; DWORD dwBytesRead = 0;
                    WinHttpReadData(hRequest, szResponse, 2048, &dwBytesRead);
                }

                // Anforderung schliessen
                WinHttpCloseHandle(hRequest);
            }

            // Verbindung schliessen
            WinHttpCloseHandle(hConnect);
        }

        // Session freigeben
        WinHttpCloseHandle(hSession);
    }

    // Ans kloar
    return 0;
}

Es wird einfach nur eine Url aufgerufen und die Antwort abgefragt, auf eine Fehlerausgabe habe ich verzichtet. Das kompilierte Programm könnt ihr hier herunterladen.

MFC abgespeckt

By Sven on 20.08.2008 - 10:00 in MFC, Visual Studio 2008 with 4 Kommentare

Letzte Woche Montag ist das Service Pack 1 für Visual Studio 2008 erschienen. Wichtige Neuerungen für den C++-Entwickler sind sicherlich die Unterstützung von TR1 und das UI-Update für die MFC. Nach den Installationsproblemen mit dem im April veröffentlichten Feature Pack wollte ich eigentlich erst einmal die Erfahrungen anderer abwarten.

Daraus wurde dann doch nichts. Zu Testzwecken hatte ich mir ein VS 2008 in einer VM installiert und anschließend das SP1 eingespielt. Probleme gab es keine, die Microsoft-Entwickler haben aus dem Feature Pack-Dilemma gelernt und diesmal wieder ausreichend getestet.

Erfreulicherweise hat Microsoft auch das Konzept beibehalten, die bisherige MFC sowie die neuen UI-Klassen nicht zu verzahnen. Somit kann man die Einbindung der neuen Klassen durch Entfernen der entsprechenden Sektion im Makefile sehr einfach entfernen und die MFC weiter im bisherigen Umfang verwenden. Nach dem Löschen der nicht mehr benötigten Dateien hat man wieder ein schlankes und übersichtliches MFC-Verzeichnis.

Neben den neuen UI-Klassen gab es in der Standard-MFC nur kleinere Korrekturen. Die in afximpl.h definierten Konstanten CX_BORDER und CY_BORDER wurden nach AFX_CX_BORDER und AFX_CY_BORDER umbenannt. Bei einigen Zeigern fehlte bisher die Prüfung gegen NULL, das wurde mit dem SP1 auch behoben.

Nach den positiven Erfahrungen bei der VM-Installation habe ich das SP1 dann auch auf meinem Entwicklungsrechner eingespielt sowie C/C++-Laufzeit und MFC kompiliert. Die Anleitungen für die C/C++-Laufzeit sowie für die MFC sind weiter gültig, zusätzlich müssen für einen manifestlosen Einsatz die Linkerkommentare in appmodul.cpp

#pragma comment(linker, "/include:__forceMFCManifestRTM")

und crtdll.c

#pragma comment(linker, "/include:__forceCRTManifestRTM")

auskommentiert werden. Ansonsten beschwert sich der Linker beim Erstellen der CRT sowie beim Erstellen einer MFC-Anwendung über einen fehlenden Import. Bisher habe ich leider noch nicht herausgefunden, was diese beiden Linkerkommentare bewirken sollen. Die RTM-Version kam noch ohne diese aus.

Fehler 1603 bei der Installation von TFS 2008 SP1

By Sven on 18.08.2008 - 10:00 in TFS with 4 Kommentare

Die Aktualisierung auf TFS 2008 SP1 wurde kurz vor Fertigstellung mit dem Fehler 1603 beendet. Beim Durchstöbern der Log-Dateien entdeckte ich folgende Zeilen:

Using workflow file from location exe.
Executing workflow ‚Unquiesce AT’…
Stopping Windows Service ‚W3SVC’…
Starting Windows Service ‚W3SVC’…
Starting Windows Service ‚TFSServerScheduler’…
Der Dienst TFSServerScheduler kann nicht auf dem Computer . gestartet werden.
Retrying…
Starting Windows Service ‚TFSServerScheduler’…
Der Dienst TFSServerScheduler kann nicht auf dem Computer . gestartet werden.
Retrying…
Starting Windows Service ‚TFSServerScheduler’…
Der Dienst TFSServerScheduler kann nicht auf dem Computer . gestartet werden.
Retrying…
Starting Windows Service ‚TFSServerScheduler’…
Der Dienst TFSServerScheduler kann nicht auf dem Computer . gestartet werden.
Retrying…
Starting Windows Service ‚TFSServerScheduler’…
Der Dienst TFSServerScheduler kann nicht auf dem Computer . gestartet werden.
Retrying…
Starting Windows Service ‚TFSServerScheduler’…
System.InvalidOperationException: Der Dienst TFSServerScheduler kann nicht auf dem Computer . gestartet werden. —> System.ComponentModel.Win32Exception: Der angegebene Dienst kann nicht gestartet werden. Er ist deaktiviert oder nicht mit aktivierten Ger„ten verbunden
   — Ende der internen Ausnahmestapelberwachung —

Nach diesen Zeilen startete dann das Rollback. 

Die Startprobleme mit TFSServerScheduler kenne ich schon seit der Installation des TFS. Dieser Dienst ist dafür verantwortlich, die Warehouse-Datenbanken zu aktualisieren, auf denen die verschiedenen generierten Reporte aufbauen. TFSServerScheduler ist abhängig vom Windows-Anmeldedienst (Netlogon), der sich nach dem Start auf normalen Servern und Arbeitsplatzrechnern aber gleich wieder beendet. Er ist der Meinung, dass seine Dienste nur beim Arbeiten in einer Domäne nötig sind. Um auf die Berichte nicht verzichten zu müssen, habe ich mir ein kleines Hilfsprogramm geschrieben. Dazu demnächst mehr.

Dummerweise lässt sich der TFS aber nicht direkt auf einem Domänencontroller (DC) installieren. Bis kurz vor der finalen Version von TFS 2005 war das wohl noch möglich, laut Berichten in diversen Foren soll das mit der nächsten Version (Rosario) auch wieder möglich sein. Allerdings habe ich keine Lust, mir bis dahin noch einen zweiten Server als DC einzurichten.

Das halb eingespielte Update hatte den TFS 2008 aber in einen undefinierten Status gebracht, Verbindungsversuche wurden mit folgendem Fehler abgelehnt:

TF31001: Team Foundation kann die Liste von Teamprojekten aus Team Foundation Server nicht abrufen. Team Foundation Server gab folgenden Fehler zurück: Fehler bei der Anforderung mit HTTP-Status 503: TF30059: Schwerwiegender Fehler beim Initialisieren des Webdiensts.

Was tun? Die Lösung bestand darin, auf meinem Entwicklungsrechner in einer VM einen Windows Server 2003 zu installieren und diesen als DC einzurichten. Nach dem Beitritt des Server zu dieser Domäne ließ sich auch der Windows-Anmeldedienst samt TFSServerScheduler starten und das Update lief fehlerfrei durch. Anschließend hat der Server die Domäne wieder verlassen und läuft nun wieder eigenständig.

Bin ich denn etwa der Einzige, der den TFS 2008 ohne Domäne betreibt?

Erste Beta zu SpeedCommander 12.30

By Sven on 13.08.2008 - 10:00 in SpeedCommander 12 with 1 Kommentar

Im öffentlichen Betabereich des Anwenderforums könnt ihr euch die erste Beta zu SpeedCommander 12.30 herunterladen. Die Hintergrundfarbe für die Vororteditierfelder kann jetzt angepasst werden, was besonders den Nutzern des NC-Farbschemas gefallen sollte.

Neu ist auch eine Einstellung, mit der das automatische Ausblenden des Registerkartenbereichs deaktiviert werden kann, wenn nur ein Ordnerfenster angezeigt wird. Einige kleine Fehler wurden ebenfalls behoben.

Die nächste Beta ist für Ende August geplant, mit der finalen Version ist dann Ende September zu rechnen.

Top