Erstellen Sie eine kleine und prägnante windows service mit Delphi
Ich erstellt habe, sehr einfaches windows-Dienst-app-updates einige Dateien chronologisch mit Delphi. Die service-app kompiliert und funktioniert gut, aber ich bin nicht glücklich mit der definitiven exe-Datei Größe. Seine über 900K. Der Dienst selbst nicht verwenden, Formulare, Dialoge, aber dennoch sehe ich SvcMgr ist die Referenzierung von Formularen und anderen großer Mist ist, den ich nicht verwende.
Name Size Group Package
------------ ------ ----- -------
Controls 80,224 CODE
Forms 61,204 CODE
Classes 46,081 CODE
Graphics 37,054 CODE
Gibt es eine Möglichkeit, ich kann die service-app kleiner? oder gibt es einen anderen service-Vorlage, die ich verwenden kann ohne Verwendung von Formen etc?
schreiben Sie in C++ - wenn Sie möchten, eine kleinere exe-Datei.
Es kann getan werden gerade fein in Delphi. Mein Beispiel unten erzeugt 50K große service, hat alles, was ein Delphi Dienst tun können. In den meisten Fällen ist dies völlig unnötig, aber es kann in handliches kommen. Wenn nichts anderes, dann als einen Lernprozess. Trotzdem bittet er um eine kleine ausführbare Datei in Delphi, so Ihr Kommentar ist ein wenig unhöflich.
Warum C++? Man könnte auch implementieren, die es in reinem C oder gar in assembler 😉 Jedenfalls was ist gut an Delphi ist, können Sie gehen, die Reine Windows-API Programmierung auf die gleiche Weise wie in C/C++, wenn Sie es brauchen - und Sie wissen, wie man code, der Weise. Der standard-Ansatz trades einfach zu verwenden für die Größe, denke die meisten Leute hier nicht merken, wenn Windows Programmierungen beschuldigt wurde, "bedürfen einer hundert Zeilen code, um zu zeigen, 'Hallo Welt' ". Er könnte auch versuchen zu kompilieren, die mit Laufzeit-packages erhalten Sie eine kleine exe-Datei (und dann zu verteilen - aber auch VC++ kann verlangen, seine eigenen DLLs)
Für kleine Anwendungen, die ausgeführt werden sollen, in Intervallen die bevorzugte Methode nun ist die Verwendung des Windows Scheduler statt mit einem service, dort zu sitzen, nichts zu tun. Der Vorteil ist, Sie haben nur ein Prozess aktiv ist, während der geplanten Prozesse, die ausgeführt werden, dann kündigen, ohne Verwendung von system-Ressourcen (RAM, CPU-Zeit, etc.). Wenn Sie sind besorgt über Ihr exe-Größe, sollten Sie sich auch Gedanken darüber machen, wie viele system-Ressourcen nutzt es vielleicht uselessy.
das ist, weil ein Standard-service in Delphi bietet eine design-Zeit-Fläche (der Dienst, datamodule) bereit, zu akzeptieren, Komponenten, event-log-reporting-code und so weiter. Das hat natürlich einen Preis. In der Regel ein service-fügt viel mehr code und macht, dass der overhead vernachlässigbar, aber für sehr einfache Anforderungen, könnte es zu viel sein. Aber das ist nur die VCL-Implementierung, niemand verbietet das hinzufügen von kleineren. Ich denke mal, ein standard-MSVC-Dienst erfordert viel mehr Aufwand, um nützliche features hinzufügen. Vergessen Sie dies, bedeutet vergleichen Apfel mit Birnen.
Es kann getan werden gerade fein in Delphi. Mein Beispiel unten erzeugt 50K große service, hat alles, was ein Delphi Dienst tun können. In den meisten Fällen ist dies völlig unnötig, aber es kann in handliches kommen. Wenn nichts anderes, dann als einen Lernprozess. Trotzdem bittet er um eine kleine ausführbare Datei in Delphi, so Ihr Kommentar ist ein wenig unhöflich.
Warum C++? Man könnte auch implementieren, die es in reinem C oder gar in assembler 😉 Jedenfalls was ist gut an Delphi ist, können Sie gehen, die Reine Windows-API Programmierung auf die gleiche Weise wie in C/C++, wenn Sie es brauchen - und Sie wissen, wie man code, der Weise. Der standard-Ansatz trades einfach zu verwenden für die Größe, denke die meisten Leute hier nicht merken, wenn Windows Programmierungen beschuldigt wurde, "bedürfen einer hundert Zeilen code, um zu zeigen, 'Hallo Welt' ". Er könnte auch versuchen zu kompilieren, die mit Laufzeit-packages erhalten Sie eine kleine exe-Datei (und dann zu verteilen - aber auch VC++ kann verlangen, seine eigenen DLLs)
Für kleine Anwendungen, die ausgeführt werden sollen, in Intervallen die bevorzugte Methode nun ist die Verwendung des Windows Scheduler statt mit einem service, dort zu sitzen, nichts zu tun. Der Vorteil ist, Sie haben nur ein Prozess aktiv ist, während der geplanten Prozesse, die ausgeführt werden, dann kündigen, ohne Verwendung von system-Ressourcen (RAM, CPU-Zeit, etc.). Wenn Sie sind besorgt über Ihr exe-Größe, sollten Sie sich auch Gedanken darüber machen, wie viele system-Ressourcen nutzt es vielleicht uselessy.
das ist, weil ein Standard-service in Delphi bietet eine design-Zeit-Fläche (der Dienst, datamodule) bereit, zu akzeptieren, Komponenten, event-log-reporting-code und so weiter. Das hat natürlich einen Preis. In der Regel ein service-fügt viel mehr code und macht, dass der overhead vernachlässigbar, aber für sehr einfache Anforderungen, könnte es zu viel sein. Aber das ist nur die VCL-Implementierung, niemand verbietet das hinzufügen von kleineren. Ich denke mal, ein standard-MSVC-Dienst erfordert viel mehr Aufwand, um nützliche features hinzufügen. Vergessen Sie dies, bedeutet vergleichen Apfel mit Birnen.
InformationsquelleAutor Darkerstar | 2011-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der code, den ich verwendet, um eine sehr kleine service basiert auf reiner API. Die Größe der exe ist nur 50K. Wahrscheinlich könnte sogar noch kleiner, ich habe einige andere Einheiten werden könnte, weggelassen. Der compiler verwendet wurde, war Delphi 7. Wahrscheinlich größer sein wird mit neuen Compilern, aber ich habe nicht überprüfen.
Der code ist sehr alt und ich habe nicht überprüfen. Ich schrieb vor Jahren. So nehmen Sie es als ein Beispiel, nicht kopieren und einfügen, bitte.
EDIT:
Ich kompiliert der obige code ohne Ressourcen und SysUtils. Ich habe 32KB ausführbare Datei unter Delphi XE und 22KB ausführbare Datei unter Delphi 2006. Unter XE entfernte ich die RTTI-Informationen. Ich blog über diese, weil es interessant ist. Ich möchte wissen, wie groß ist die C++ - executable.
EDIT2:
Ich aktualisierte den code. Es ist ein funktionierendes code jetzt. Die meisten der größeren bugs Weg sein sollte. Es ist noch keineswegs Qualität in der Produktion.
Wahrscheinlich ja, wie ich sagte, es ist ein sehr altes Beispiel. Und wissen, wie man es in dem code ist ein plus. Aber es kann sein, gestreifte aus.
InformationsquelleAutor Runner
Können ohne die "großen Mist". Aber dann haben Sie zu sprechen, um die windows-API selbst. Haben Sie einen Blick auf die Quelle Hinweise.
Den "großen Mist" ist es, die das Programmieren einfacher machen für Sie. Es Handel einen Rückgang der Entwurfszeit für eine Zunahme der code-Größe. Es ist nur eine Frage von, was Sie denken, ist wichtig.
Außerdem haben Sie kompiliert werden, ohne debug-Informationen? Debug-Informationen, erhöhen Sie die exe-Größe eine Menge.
und ja, in der Zwischenzeit Suche ich den source-code zu extrahieren, die core-APIs verwendet. Ich sehr viel wie KOL, für seine kleine apps, die es produzieren. 🙂
InformationsquelleAutor Toon Krijthe
Wenn Sie mit Delphi 6 oder 7, werfen Sie einen Blick auf unsere LVCL open-source-Bibliotheken.
Finden Sie hier einige Ersatz für die standard-VCL-units, mit viel weniger code Gewicht. Es verfügt über grundlegende GUI-Komponenten (TLabel/TEdit und so), nur das, was notwendig war, um ein Setup-Programm erstellen. Aber es wurde entwickelt, um verwendet werden, ohne GUI.
Ausführbare Datei-Größe, wird kleiner als mit dem standard-VCL-Einheiten verwenden, auch wenn Sie nur SysUtils und Classes Einheiten. Und es wird auch schneller als VCL für einige Operationen (hab ich auch schon enthalten FastCode Teil, oder neu geschrieben, einige andere Teil in asm). Perfekt für einen hintergrund-service.
Behandeln Hintergrunddienst, es ist die SQLite3Service.pas Einheit, die funktioniert perfekt mit LVCL. Es ist mehr high-level als direkte API-Aufruf.
Hier ist eine perfekt funktionierende hintergrund-Dienst Programm:
Kannst du zusätzliche Fragen auf unserem forum, wenn Sie es wünschen.
Beeindruckend! Haben Sie einen Blick auf es.
Ich muss etwas fehlen, denn obwohl dieser funktioniert, ich kann es nicht mehr zu akzeptieren, meine stop-Anfragen, wenn Sie mit diesem in einem größeren service-Projekt...über "sc stop-svcname". Irgendwelche Ideen?
InformationsquelleAutor Arnaud Bouchez
Können Sie immer verwenden Sie die Visual Studio service-Vorlage erstellen, eine kleine service-host, die sogenannte Delphi-code, kompiliert in einer DLL. Etwas unordentlich, aber wahrscheinlich die einfachste Weise schneiden Sie die Größe nach unten ab, wo Sie sind. Die einfach nichts tun, service ist ein 91KB mit einer statischen Verknüpfung oder 36KB mit dynamischen Anbindung an die C-Laufzeit.
Stimmt, aber die service app wäre noch kleiner in MSVC als Delphi, wenn es geschrieben wurde, direkt gegen die Windows-API anstatt mit den eingebauten Projekt-Vorlage. Die 91KB hier zitiert ist für die service-erstellt aus der built-in template.
Auf dieser Ebene der ausführbaren Größe, einige KB macht nicht viel Sinn. Nur das laden der exe-Datei eine Verknüpfung zur Windows-dll, und initialisieren seine Speicher-manager verwenden viel mehr RAM als die. Exe Größe bedeutet nicht viel.
Gut, ich grundsätzlich einverstanden mit, dass auch, aber die OP hat die Frage stellen. Ich finde die unnötige Verschwendung reizt zwar, fast auf einen Punkt-Prinzip.
InformationsquelleAutor David Heffernan