Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL-verkleinern (https://www.delphipraxis.net/570-dll-verkleinern.html)

theomega 9. Aug 2002 17:16


DLL-verkleinern
 
Hallo:
ich habe eine einfache DLL geschreiben:
Code:
library plugin;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse weitergibt. Dies trifft auf alle
  Strings zu, die von oder zur DLL weitergegeben werden -- auch diejenigen, die
  sich in Records oder Klassen befinden. ShareMem ist die Schnittstellen-Unit
  zu BORLNDMM.DLL, der gemeinsamen Speicherverwaltung, die zusammen mit
  der DLL weitergegeben werden muß. Um die Verwendung von BORLNDMM.DLL
  zu vermeiden, sollten String-Informationen als PChar oder ShortString übergeben werden. }

uses
  SysUtils,
  Classes;

{$R *.RES}

function texter: pchar; stdcall;

begin
  Result := pchar(datetimetostr(now));
end;

exports
 texter;

begin
end.
diese DLL ist jetzt 293 kb groß! Muß dass wirklich sein? also ich mein, kann man da nich noch irgendwass tun, damit die kleiner wird. Dabei meine ich nicht einen Leufzeitkomprierer (z.b. UPX).

Danke

theOMEGA

Chewie 9. Aug 2002 17:20

Die Sysutils und die Classes blähen die DLL so auf. Du kannst diese Unnits weglassen und einfach nur die Funktionen rauskopieren, die du brauchst. Ich weiß aber nicht, ob das lizenzrechtlich legal ist.

sakura 9. Aug 2002 17:27

Das ist lizenzrechtlich legal (glaube ich/ohne Gewähr), solange man den Source Code nicht veröffentlicht!

MathiasSimmack 9. Aug 2002 19:01

Luckie wird´s freuen, denn zum Thema Datum & Zeit und die Formatierung der Ausgabe kann ich folgendes bringen:
Code:
[color=#000080][i]// @Luckie: ;o)[/i][/color]
[b]function[/b] frmt(mformat: [b]string[/b]; args: [b]array[/b] [b]of[/b] POINTER): [b]string[/b];
[b]var[/b]
  bla: pchar;
[b]const[/b]
  Size = 1024;
[b]begin[/b]
  getmem(bla, size);
  ZeroMemory(bla, size);
  wvsprintf(bla, pchar(mformat), pchar(@args));
  result := [b]string[/b](bla);
  freemem(bla, size);
[b]end[/b];


[b]var[/b]
  SystemTime : _SYSTEMTIME;

[color=#000080][i]{ ... }[/i][/color]

GetLocalTime(SystemTime);
Write2Textfile(displayname + ' gestartet: ' +
  frmt('%.2d:%.2d Uhr - %.2d.%.2d.%.4d',
    [POINTER(SystemTime.wHour),POINTER(SystemTime.wMinute),
     POINTER(SystemTime.wDay),POINTER(SystemTime.wMonth),
     POINTER(SystemTime.wYear)]) + #13#10);
Das ganze stammt aus dem NT-Dienst-Demo von Assarbad und Luckie und benutzt nur Systemfunktionen. Hier werden Datum & Zeit von Dienststart und -stop in eine Datei geschrieben.

@theomega: Schau dir mal den Format-String an! Wenn du den an deine Bedürfnisse anpasst, dann kannst du die Ausgabe so gestalten, als käme sie von datetimetostr. Nur, dass deine DLL mit obigen Systemfunktionen grandios klein werden wird. :wink:

jbg 9. Aug 2002 20:48

@theomega: Und du bist dir sicher, dass der Code keine Schutzverletzung erzeugt?
Zitat:

Code:
[b]function[/b] texter: pchar; [b]stdcall[/b];
[b]begin[/b]
  Result := pchar(datetimetostr(now));
[b]end[/b];

Den PChar den du hier zurücklieferst liegt auf dem Stack. Wenn du danach eine Funktion aufrufst, wird der "string" überschrieben.
Eine bessere Lösung wäre dies:
Code:
[b]function[/b] texter(P: PChar; MaxLen: Integer): Integer; [b]stdcall[/b];
[b]var[/b] S: [b]string[/b];
[b]begin[/b]
  S := DateTimeToStr(Now);
  [b]if[/b] P <> [b]nil then[/b] StrLCopy(P, PChar(S), MaxLen);
  Result := Length(S);
[b]end[/b];

theomega 10. Aug 2002 10:17

Nein, der Code läuft problemlos, und ohne Fehler

jbg 10. Aug 2002 10:41

Trotzdem birgt er eine Fehlerquelle, die nicht zu unterschätzen ist. Er mag vielleicht in dem Zusammenhang funktioniere, wie du ihn bis jetzt einsetzt. Aber irgenwann wird er dir den letzen Nerv rauben, da du genau weißt, dass er funktionieren muss, da er in anderen Programmen doch auf funktioniert, und du suchst den Fehler dann ganz wo anders.

theomega 10. Aug 2002 10:59

müßte es aber nicht heißen:
Code:
function texter(var P: PChar; MaxLen: Integer): Integer; stdcall;
var S: string;
begin
  S := DateTimeToStr(Now);
  if P <> nil then StrLCopy(P, PChar(S), MaxLen);
  Result := Length(S);
end;
also mit einem var.

jbg 10. Aug 2002 11:01

Nein, das var ist nicht notwendig, da nur der Inhalt, auf den P zeigt geändert wird. Oder siehst du irgendwo im Code ein P := ...?

theomega 10. Aug 2002 11:22

Versteh ich den Code jetzt richtig? Also das Ergebnis wird in die Variable mit dem Namen aus p geschrieben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz