Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Unsichtbares Programm (https://www.delphipraxis.net/113322-unsichtbares-programm.html)

himitsu 6. Mai 2008 08:15

Re: Unsichtbares Programm
 
tja, vorallem Forms und SysUtils bringen schön viel Overhead mit
(SysUtils vorallem wegen der Exceptions und den Formatvariablen wie LongDateFormat, CurrencyFormat und Co.)

und wenn er alle Units (abgesehn der Unit Windows) entfernt, ist es am Kleinsten,
aber das CopyToClipboard muß er sich dann wohl selber basteln und über die WinAPI gehn > MSDN-Library durchsuchenClipboard

agm65 6. Mai 2008 09:03

Re: Unsichtbares Programm
 
ich würde eine konsole anwendung vorschlagen, dann machst du von allen uses die du brauchst backups zB. sysutils_meins und löscht alle funktionen raus die du nicht brauchst...oder du legst dir eine uses an und kopierst dir dort alles rein was du brauchst ...so hab ich früher trojaner winzig gehalten ...zudem kannst du noch nen exepacker wie upx verwenden...

Guido Eisenbeis 7. Mai 2008 00:20

Re: Unsichtbares Programm
 
@Mackhack

Der erste Dank geht an dich! Dein Code hat mir den entscheidenen Tipp in die richtige Richtung gegeben! Hast ihn ja auch "mundgerecht" geliefert. Ich hab ihn nur entsprechend angepasst und siehe da, es funktioniert! (Ich poste ihn unten als eigene Antwort, um die Übersichtlichkeit zu erhalten.)


Zitat:

Zitat von cruiser
Konsole und dann die Compiler Direktive auskommentieren/löschen :mrgreen:

Zitat:

Zitat von toms_
zustätzlich noch die Units "SysUtils, Forms" entfernen, damit die Exe schön klein wird.

Mann seid ihr flott! *ernst-gemeint* Zu dem Zeitpunkt hatte ich das zwar auch schon per TrialAndError herausgefunden, aber dass das (von euch) bestätigt wird, ist natürlich viel besser! Vielen Dank!


@Alle

Es wurde ja oben schon ausreichend darüber diskutiert, ob Units einbinden = einkompilieren usw. Deshalb von mir nur noch, dass ich folgendes bestätigen kann: Mit Units eingebungen -> ab knapp 400 KB, ohne Units eingebunden -> 20 KB!

An alle vielen Dank!

Guido.

Guido Eisenbeis 7. Mai 2008 00:37

Re: Unsichtbares Programm
 
Den Tipp mit der eigenen Implementation einer Clipboard-Routine habe ich umgesetzt und dadurch die "Clipbrd"-Unit eingespart.
Quelle: "mittels API Text in die Zwischenablage schreiben". (Danke an OrallY!)

Hier meine Lösung:

Zur Veranschaulichung (gibts das Wort?) habe ich die Compiler Direktive für den Konsolen-AppTyp nur auskommentiert und ein ShowMessage eingebaut.

Eine Frage zum Befehl "OpenClipboard(0);":
Im Original-Tipp (siehe Quelle oben) wurde davon ausgegangen, dass dort das Handle der eigenen Form angegeben wird. Da mein unsichtbares Programm aber keine Form hat, habe ich 0 eingetragen. Ist das so in Ordnung, oder gibt das Querschläger, die im ersten Moment nicht sichtbar sind? Soll ich besser ein Handle verwenden? Z. B. per "GetDesktopWindow()"?


Delphi-Quellcode:
program Project1;

//{$APPTYPE CONSOLE}

uses
  Windows;


// Routine zum Speichern eines Textes in die Zwischenablage
procedure SetClipboardText(aText: PChar);

  procedure SetBuffer(Format: Word; var Buffer; Size: Integer);
  var
    Data: THandle;
    DataPtr: Pointer;
  begin
    OpenClipboard(0); //Clipboard wird für die Anwendung geöffnet (hWnd muss das Fensterhandle sein)
    try
      EmptyClipboard; // !Wichtig! Nur so kann das oben angegebene Fenster der "Besitzer" des Clipboards werden
      Data := GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, Size);
      try
        DataPtr := GlobalLock(Data);
        try
          Move(Buffer, DataPtr^, Size);
          SetClipboardData(Format, Data);
        finally
          GlobalUnlock(Data);
        end;
      except
        GlobalFree(Data);
        raise;
      end;
    finally
      CloseClipboard; //und wieder den Clipboard freigeben
    end;
  end;

begin
  SetBuffer(CF_TEXT, aText^, Length(aText) + 1);
end;


// Main-Routine
begin
  { TODO -oUser -cConsole Main : Insert code here }

  if (ParamCount() > 0) then
  begin
    SetClipboardText(PChar(ParamStr(1)));

//    ShowMessage('ParamCount(): ' + PChar(IntToStr(ParamCount()) + #13#10 +
//                'ParamStr(0): ' + ParamStr(0) + #13#10 +
//                'ParamStr(1): ' + ParamStr(1)));
  end;

end.

rollstuhlfahrer 7. Mai 2008 13:39

Re: Unsichtbares Programm
 
HI,

du dürftest das Programm, so wie ich das sehe schon ein bisschen getestet haben.
Wenn dort kein Fehler auftrat und der Text danach auch wirklich in der Zwischenablage angekommen ist, würde ich mal ganz einfach sagen, dass du den Handle auf 0 lassen kannst. Ansonsten probierts mal mit einem Handle oder mit INVALID_HANDLE(_VALUE ??)

rollstuhlfahrer

himitsu 7. Mai 2008 13:47

Re: Unsichtbares Programm
 
MSDN-Library durchsuchenOpenClipboard
Zitat:

[in] Handle to the window to be associated with the open clipboard. If this parameter is NULL, the open clipboard is associated with the current task.
Wenn unbedingt ein Handle nötig wäre, dann hätt ich in solch einem Fall ein MSDN-Library durchsuchenMessageWindow (MessageOnlyWindow) vorschlagen :angel:

nicodex 7. Mai 2008 13:53

Re: Unsichtbares Programm
 
SetClipboardData sollte fehlschlagen, wenn man EmptyClipboard aufruft nachdem man kein Handle bei OpenClipboard angibt.

Guido Eisenbeis 7. Mai 2008 16:41

Re: Unsichtbares Programm
 
Hallo rollstuhlfahrer,

nachdem was ich bisher gefunden habe, ist INVALID_HANDLE(_VALUE) für Rückgaben gedacht. Dennoch vielen Dank!

Ansonsten dürfte die Frage mit dem 0-Handle geklärt sein. :oops:
Getreu dem Motto "Wer lesen kann, ist besser dran!" oder "Warum in die Ferne schweifen, ..."
Denn ein Blick in die Hilfe (Platform SDK) bringt folgende Erkenntnis zu Tage:

Zitat:

The OpenClipboard function opens the clipboard for examination and
prevents other applications from modifying the clipboard content.

Syntax

BOOL OpenClipboard(HWND hWndNewOwner);

Parameters

hWndNewOwner
[in] Handle to the window to be associated with the open clipboard.
If this parameter is NULL, the open clipboard is associated with the current task.

. . .
Jetzt könnte man höchstens noch eine Grundsatzdiskussion führen, ob 0 = NULL ist. Normalerweise wird in Delphi Nil für das NULL aus C++ verwendet. "OpenClipboard(nil);" wird jedoch vom Compiler nicht akzeptiert.

Guido.

himitsu 7. Mai 2008 16:48

Re: Unsichtbares Programm
 
hmmm, und mein MSDN-Auszug interessierte keinen *schnüff*

Zitat:

Zitat von Guido Eisenbeis
nachdem was ich bisher gefunden habe, ist INVALID_HANDLE(_VALUE) für Rückgaben gedacht. Dennoch vielen Dank!

z.B.: MSDN-Library durchsuchenCreateFileMapping siehe 1. Parameter (hFile)
INVALID_HANDLE_VALUE ist nur eine Konstante, welche festlegt, daß kein ObjectHandle vorliegt.


Zitat:

Zitat von Guido Eisenbeis
ob 0 = NULL ist. Normalerweise wird in Delphi Nil für das NULL aus C++ verwendet. "OpenClipboard(nil);" wird jedoch vom Compiler nicht akzeptiert.

Delphi:
0 für Handle
nil nur bei Pointern

Mackhack 7. Mai 2008 16:49

Re: Unsichtbares Programm
 
Zitat:

Zitat von himitsu
Delphi:
0 für Handle
nil nur bei Pointern

Das muesste man in jedem Subforum als Sticky haben. Ich glaube naemlich dass viele mit diesen 2 Werten staendig im Konflikt sind 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 Uhr.
Seite 2 von 4     12 34      

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