Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-12-2008, 19:11   #1
borelg
Member
 
Iscritto dal: Apr 2008
Messaggi: 95
[C++]Gestire Firefox

Ciao a tutti, non mettetevi a ridere per la mia domanda per favore perchè mi servirebbe proprio...
Ciò che vorrei fare io sarebbe poter gestire firefox con un programma in c++, in modalità nascosta o anche in modalità massimizzata...
Le funzioni che servirebbero a me sarebbero tipo:
-inserisci nello spazio di ricerca di google la stringa S
-aspetta che la pagina si carichi
-clicca il risultato n° 2
- quando si è caricato se il contenuto della pagina è uguale alla stringa X fai il refresh

Cose di questo tipo... Mi rivolgo a voi perchè non so proprio dove cercare, mi basterebbe di funzioni poi cerco di arrangiarmi io grazie infinite in anticipo...

ps. Andrebbero bene anche per internet explorer...o un qualsiasi browser per internet...

Ultima modifica di borelg : 21-12-2008 alle 19:13.
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2008, 21:27   #2
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Città: Treviso
Messaggi: 1026
Quello che vuoi fare se non ho capito male è HTML scraping. Non serve controllare un browser per farlo, basta che usi una libreria che fa il parsing della pagina html, eventualmente la ripulisce e poi ti mette a disposizione un albero DOM da cui accedere comodamente ai dati.

Per fare queste cose mi trovo bene con Python e la libreria BeautifulSoup, piu o meno viene cosi il codice (molto semplice):

Codice:
stringaDaCercare = "xxx"
numeroRisultato = 2

risultatiRicerca = BeautifulSoup("http://www.google.it/search?q=" + stringaDaCercare)
nodo = risultatiRicerca.html.body.div[3].div.ol.li[ numeroRisultato ].h3.a
link = nodo["href"].strip()
target = BeautifulSoup(link)
stringa = target.html.body.string.strip()
if stringa==stringaDaCercare: doSomething()
Il percorso alla riga 2 puoi ricavarlo usando l'estensione Firebug per Firefox, cliccando su 'analizza' e poi sull'elemento della pagina di cui vuoi ottenere il percorso.

Una volta l'ho fatto anche in C++ usando TidyLib, è un po piu complesso pero.

Ultima modifica di PhysX : 22-12-2008 alle 10:14.
PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2008, 13:36   #3
borelg
Member
 
Iscritto dal: Apr 2008
Messaggi: 95
scusami tanto ma io phyton non saprei neanke da dove iniziare... non è che c' è un alternativa per il c++? grazie mille...
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2008, 17:12   #4
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Città: Treviso
Messaggi: 1026
Per C++ non so se ci sono librerie già pronte che fanno la stessa cosa, io mi ero fatto un parser usando TidyLib, si usa cosi:

Codice PHP:
Parser parser(fileName);
if (!
parser.isValid()) return false;

// getText ritorna il testo contenuto nel nodo:
title parser.getText("/html/body/div/table[2]/tr/td[2]/p/a/font/b/");
author parser.getText("/html/body/div/table[2]/tr/td[2]/p/a[2]/font/b/");
description parser.getText("/html/body/div/table[2]/tr/td[2]/p/");

// getValue ritorna il valore della proprieta specificata del nodo:
// (in questo caso è l'attributo HREF)
imageUrl parser.getValue("/html/body/div/table[2]/tr/td[2]/a/"TidyAttr_HREF);
downloadUrl parser.getValue("/html/body/div/table[2]/tr/td[2]/p/a/"TidyAttr_HREF); 
qua c'è il codice della classe Parser, al posto di wxString puoi usare std::string se non usi wxWidget. per usarlo basta che includi il file parser.h nel tuo progetto e lo linki a tidylib.

Codice PHP:
#include <tidy.h>
#include <buffio.h>
#include <stdio.h>
#include <errno.h>
#include "wx/wx.h"
#include "wx/string.h"

class Parser {
    
TidyDoc tdoc;
    
bool valid;

    
bool walk(TidyNode &currentNode, const chartagint pos);
    
void analizeToken(wxString &tokenint &pos);
    
TidyNode getNode(wxString path);
public:
    
Parser();
    
Parser(const charinput);
    
bool open(const charinput);
    
wxString getValue(wxString pathTidyAttrId attr);
    
wxString getText(wxString path);
    
bool isValid() const;
    ~
Parser();
};

Parser::Parser() {
    
valid=false;
}
Parser::Parser(const charinput) {
    
open(input);
}

bool Parser::open(const charinput) {
    
TidyBuffer output = {0};
    
TidyBuffer errbuf = {0};
    
int rc = -1;
    
Bool ok;
    
valid=false;

    
assert(input);

    
tdoc tidyCreate();                     // Initialize "document"
    
ok tidyOptSetBooltdocTidyXhtmlOutyes );  // Convert to XHTML
    
if ( ok )
    
rc tidySetErrorBuffertdoc, &errbuf );      // Capture diagnostics
    
if ( rc >= )
    
rc tidyParseStringtdocinput );           // Parse the input
    
if ( rc >= )
    
rc tidyCleanAndRepairtdoc );               // Tidy it up!
    
if ( rc >= )
    
rc tidyRunDiagnosticstdoc );               // Kvetch
    
if ( rc )                                    // If error, force output.
    
rc = ( tidyOptSetBool(tdocTidyForceOutputyes) ? rc : -);
    if ( 
rc >= )
    
rc tidySaveBuffertdoc, &output );          // Pretty Print

    
if ( rc >= )
        
valid=true;
    else 
        
valid=false;
    
tidyBufFree( &output );
    
tidyBufFree( &errbuf );
    return 
valid;
}
bool Parser::isValid() const {
    return 
valid;
}
Parser::~Parser() {    
    
tidyReleasetdoc );
}
TidyNode Parser::getNode(wxString path) {
    
TidyNode currentNode=tidyGetRoot(tdoc);
    
int initTag,endTag,pos;
    
wxString token;    
    
initTag=1;
    
endTag=path.find('/',initTag);
    while (
endTag!=wxString::npos) {
        
token=path.substr(initTag,endTag-initTag);
        if (
token.IsEmpty()) continue;
        
analizeToken(tokenpos);
        if (!
walk(currentNodetoken.mb_str(),pos)) return 0;
        
initTag=endTag+1;
        
endTag=path.find('/',initTag);
        
charname=(char*)tidyNodeGetName(currentNode);
    }
    return 
currentNode;
}

wxString Parser::getValue(wxString pathTidyAttrId attr) {
    
wxString result;
    
TidyNode currentNode=getNode(path);
    if (
currentNode)
        
result=wxString((char*)tidyAttrValue(tidyAttrGetById(currentNodeattr)), wxConvUTF8);
    return 
result;
}

wxString Parser::getText(wxString path) {
    
TidyNode currentNode=getNode(path);
    
wxString result;
    if (!
currentNode) return result;
    
    for (
TidyNode child=tidyGetChild(currentNode); childchild=tidyGetNext(child)) {
        if (
tidyNodeIsText(child)) {
            
TidyBuffer buf={0};
            
tidyNodeGetText(tdocchild, &buf);
            
result+=wxString((char*)buf.bpwxConvUTF8);
        }
    }
    return 
result;
}

void Parser::analizeToken(wxString &tokenint &pos) {
    
int pqa=token.find('[');
    
int pqb=token.find(']');
    
pos=1;
    if (
pqa!=wxString::npos && pqb!=wxString::npos) {
        
wxString stringpos=token.substr(pqa+1,pqb-pqa-1);
        
pos=atoi(stringpos.mb_str());
        
token=token.substr(0,pqa);
    }
}

bool Parser::walk(TidyNode &currentNode, const chartagint pos) {
    
assert(tag);
    
assert(pos>=1);        
    
int index=0;
    
TidyNode child;
    for ( 
child tidyGetChild(currentNode); childchild tidyGetNext(child) ) {
        
charname=(char*)tidyNodeGetName(child);
        if (!
name) continue;
        if (!
strcmp(nametag)) index++;
        if (
index==pos) {
            
currentNode=child;
            return 
true;
        }
    }
    return 
false;

PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2008, 11:48   #5
borelg
Member
 
Iscritto dal: Apr 2008
Messaggi: 95
ok grazie infinite... ma scusa la mia ignoranza non ho ben capito quali sarebbero le funzioni da utilizzare con quel codice li... grazie infinite..
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2008, 11:57   #6
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Città: Treviso
Messaggi: 1026
Quote:
Originariamente inviato da borelg Guarda i messaggi
ok grazie infinite... ma scusa la mia ignoranza non ho ben capito quali sarebbero le funzioni da utilizzare con quel codice li... grazie infinite..
Metti che hai questa pagina html:

Codice PHP:
<html>
<
title>Temperature></title>
<
body>
<
div>
<
b>Citta</b><br>
<
table>
<
tr>
<
td>Milano:</td>
<
td>32</td>
</
tr>
</
table>
<...> 
e vuoi scrivere del codice in C++ che legge la temperatura, fai cosi:

Codice PHP:
Parser parserHMTLcode ); 
if (!
parser.isValid()) return false

string temperatura parser.getText("/html/body/div/table/tr/td[2]");

cout << "La temperatura è: " << temperatura

Invece getValue ritorna un attributo del nodo che ti serve.
Ad esempio se voglio ottenere l'attributo HREF di un tag <a> basta fare cosi:

Codice PHP:
string link parser.getValue("/html/body/a"TidyAttr_HREF); 
PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2008, 12:00   #7
borelg
Member
 
Iscritto dal: Apr 2008
Messaggi: 95
si ma io non conosco il codice della pagina da cui voglio prendere i dati...
è un problema?
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2008, 12:06   #8
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Città: Treviso
Messaggi: 1026
Quote:
Originariamente inviato da borelg Guarda i messaggi
si ma io non conosco il codice della pagina da cui voglio prendere i dati...
è un problema?
nel primo post avevi scritto:

Quote:
Le funzioni che servirebbero a me sarebbero tipo:
-inserisci nello spazio di ricerca di google la stringa S
-aspetta che la pagina si carichi
-clicca il risultato n° 2
- quando si è caricato se il contenuto della pagina è uguale alla stringa X fai il refresh

per fare queste cose il codice ce l'hai a disposizione, basta che sul browser clicchi su visualizza codice html.
per trovare facilmente il percorso di quello che ti interessa all'interno del codice HTML complesso puoi usare il plugin FireBug che ti permette di analizzare il codice html con strumenti avanzati.
PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2008, 12:10   #9
borelg
Member
 
Iscritto dal: Apr 2008
Messaggi: 95
ahah... io non ne avevo idea che firefox avesse questa funzionalità.... fantastico... comunque ho provato il codice che hai postato su dev c++ e mi dice:
Codice:
main.cpp:1:18: tidy.h: No such file or directory
main.cpp:2:20: buffio.h: No such file or directory
main.cpp:5:19: wx/wx.h: No such file or directory
main.cpp:6:23: wx/string.h: No such file or directory

main.cpp:9: error: `TidyDoc' does not name a type
main.cpp:12: error: expected `;' before '(' token
main.cpp:13: error: variable or field `analizeToken' declared void
main.cpp:13: error: expected `;' before '(' token
main.cpp:14: error: `TidyNode' does not name a type
main.cpp:19: error: `wxString' does not name a type
main.cpp:20: error: `wxString' does not name a type

main.cpp: In member function `bool Parser::open(const char*)':

main.cpp:33: error: `TidyBuffer' undeclared (first use this function)
main.cpp:33: error: (Each undeclared identifier is reported only once for each function it appears in.)

main.cpp:33: error: expected `;' before "output"
main.cpp:34: error: expected `;' before "errbuf"
main.cpp:36: error: `Bool' undeclared (first use this function)
main.cpp:36: error: expected `;' before "ok"
main.cpp:39: error: `assert' undeclared (first use this function)
main.cpp:41: error: `tdoc' undeclared (first use this function)
main.cpp:41: error: `tidyCreate' undeclared (first use this function)
main.cpp:42: error: `ok' undeclared (first use this function)
main.cpp:42: error: `TidyXhtmlOut' undeclared (first use this function)
main.cpp:42: error: `yes' undeclared (first use this function)
main.cpp:42: error: `tidyOptSetBool' undeclared (first use this function)
main.cpp:44: error: `errbuf' undeclared (first use this function)
main.cpp:44: error: `tidySetErrorBuffer' undeclared (first use this function)
main.cpp:46: error: `tidyParseString' undeclared (first use this function)
main.cpp:48: error: `tidyCleanAndRepair' undeclared (first use this function)
main.cpp:50: error: `tidyRunDiagnostics' undeclared (first use this function)
main.cpp:52: error: `TidyForceOutput' undeclared (first use this function)
main.cpp:54: error: `output' undeclared (first use this function)
main.cpp:54: error: `tidySaveBuffer' undeclared (first use this function)
main.cpp:60: error: `tidyBufFree' undeclared (first use this function)

main.cpp: In destructor `Parser::~Parser()':
main.cpp:68: error: `tdoc' undeclared (first use this function)
main.cpp:68: error: `tidyRelease' undeclared (first use this function)

main.cpp: At global scope:
main.cpp:70: error: `TidyNode' does not name a type
main.cpp:88: error: `wxString' does not name a type
main.cpp:96: error: `wxString' does not name a type
main.cpp:111: error: variable or field `analizeToken' declared void

main.cpp:111: error: `int Parser::analizeToken' is not a static member of `class Parser'
main.cpp:111: error: `wxString' was not declared in this scope
main.cpp:111: error: `token' was not declared in this scope
main.cpp:111: error: expected primary-expression before "int"
main.cpp:111: error: initializer expression list treated as compound expression
main.cpp:111: error: expected `,' or `;' before '{' token
main.cpp:122: error: `bool Parser::walk' is not a static member of `class Parser'
main.cpp:122: error: `TidyNode' was not declared in this scope
main.cpp:122: error: `currentNode' was not declared in this scope
main.cpp:122: error: expected primary-expression before "const"
main.cpp:122: error: expected primary-expression before "int"
main.cpp:122: error: initializer expression list treated as compound expression
main.cpp:122: error: expected `,' or `;' before '{' token

make.exe: *** [main.o] Error 1

Esecuzione terminata
In poche parole non ha le librerie... dove le potrei trovare? grazie ancora per il tuo aiuto

ps. In firefox dove sarebbe visualizza codice html??
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2008, 13:04   #10
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Città: Treviso
Messaggi: 1026
Quote:
Originariamente inviato da borelg Guarda i messaggi
ahah... io non ne avevo idea che firefox avesse questa funzionalità.... fantastico... comunque ho provato il codice che hai postato su dev c++ e mi dice:

In poche parole non ha le librerie... dove le potrei trovare? grazie ancora per il tuo aiuto

ps. In firefox dove sarebbe visualizza codice html??
Tuti i browser ti permettono di vedere il codice html della pagina che stai visualizzando! Su firefox devi premere Ctrl+U.
Per internet explorer invece c'è l'estensione HttpWatch simile a firebug.


Per compilare quel codice devi prima scaricare i sorgenti di TidyLib, compilarli e linkarli al tuo progetto.
Qua ci sono i link per il download e le istruzioni: http://tidy.sourceforge.net/libintro.html

Se conosci il C++ queste cose dovresti saperle fare, comunque se usi Visual C++ Express al posto di DevC++ è meglio, puoi scaricarlo gratis da qua: http://www.microsoft.com/express/vc/

Al posto di wxString usa std::string.
Alla funzione:
Codice PHP:
Parser parserHMTLcode ); 
devi passare un array di char che contengono il codice HTML.
per ottenere dal tuo programma in C++ il codice html di una pagina web puoi usare Curl.
Scarichi i sorgenti da qua: http://curl.haxx.se/libcurl/ , li compili e li linki al to progetto.
Poi usa questa funzione per ottenere il codice:

Codice PHP:
charcodiceHTML downloadFile("http://www.google.it/"); 
questo è il codice della funzione downloadFile::

Codice PHP:
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

#include <fstream>

struct MemoryStruct {
    
char *memory;
    
size_t size;
};

static 
void *myrealloc(void *ptrsize_t size)
{
    if(
ptr)
        return 
realloc(ptrsize);
    else
        return 
malloc(size);
}

static 
size_t WriteMemoryCallback(void *ptrsize_t sizesize_t nmembvoid *data)
{
    
size_t realsize size nmemb;
    
struct MemoryStruct *mem = (struct MemoryStruct *)data;

    
mem->memory = (char*) myrealloc(mem->memorymem->size realsize 1);
    if (
mem->memory) {
        
memcpy(&(mem->memory[mem->size]), ptrrealsize);
        
mem->size += realsize;
        
mem->memory[mem->size] = 0;
    }
    return 
realsize;
}

chardownloadfile(const charurl) {
    
CURL *curl_handle;

    
struct MemoryStruct chunk;

    
chunk.memory=NULL/* we expect realloc(NULL, size) to work */
    
chunk.size 0;    /* no data at this point */

    
curl_global_init(CURL_GLOBAL_ALL);

    
/* init the curl session */
    
curl_handle curl_easy_init();

    
/* specify URL to get */
    
curl_easy_setopt(curl_handleCURLOPT_URLurl);

    
/* send all data to this function  */
    
curl_easy_setopt(curl_handleCURLOPT_WRITEFUNCTIONWriteMemoryCallback);

    
/* we pass our 'chunk' struct to the callback function */
    
curl_easy_setopt(curl_handleCURLOPT_WRITEDATA, (void *)&chunk);

    
/* some servers don't like requests that are made without a user-agent
    field, so we provide one */
    
curl_easy_setopt(curl_handleCURLOPT_USERAGENT"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092510 Ubuntu/8.04 (hardy) Firefox/3.0.3");

    
/* get it! */
    
curl_easy_perform(curl_handle);

    
/* cleanup curl stuff */
    
curl_easy_cleanup(curl_handle);

    
/*
    * Now, our chunk.memory points to a memory block that is chunk.size
    * bytes big and contains the remote file.
    *
    * Do something nice with it!
    *
    * You should be aware of the fact that at this point we might have an
    * allocated data block, and nothing has yet deallocated that data. So when
    * you're done with it, you should free() it as a nice application.
    */

    /* we're done with libcurl, so clean it up */
    
curl_global_cleanup();

    return 
chunk.memory;
    

il vettore di char che ottieni contiene il codice HTML da passare al parser che ti ho messo nei post prima.

Ultima modifica di PhysX : 23-12-2008 alle 13:14.
PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2008, 08:01   #11
borelg
Member
 
Iscritto dal: Apr 2008
Messaggi: 95
ok grazie infinite ho quasi capito tutto... però + di ogni altra cosa mi interessava una funzione in grado di far aspettare il programma finchè la nuova pagina web si fosse caricata... Non c' è qualche soluzione a questo?
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2008, 12:07   #12
PhysX
Senior Member
 
Iscritto dal: Jun 2008
Città: Treviso
Messaggi: 1026
Quote:
Originariamente inviato da borelg Guarda i messaggi
ok grazie infinite ho quasi capito tutto... però + di ogni altra cosa mi interessava una funzione in grado di far aspettare il programma finchè la nuova pagina web si fosse caricata... Non c' è qualche soluzione a questo?
non so se ho capito bene, quando chiami:

Codice PHP:
charcodiceHTML downloadFile("http://www.google.it/search?q=Windows"); 
il programma resta fermo la finche non ha scaricato tutto il codice HTML della pagina, per cui non serve che fai niente per aspettare.

Quella funzione infatti scarica solo il codice HTML, se invece ti serve scaricare delle immagini o altri file devi prima ottenere il link cosi:

Codice PHP:
string urlImmagine parser.getValue("..percorso del tag <img>"TidyAttr_HREF); 
e poi usare questa funzione per scaricare il file:
Codice PHP:
saveToFile("urlImmagine.c_str(), "C:\\immagine.jpg"); 
il codice è sto qua, va messo nel file assieme alla funzione downloadFile:

Codice PHP:
bool saveToFile(const charurlchardestinationFile) {
    
charvalue=downloadfile(url);
    
std::ofstream output(destinationFilestd::ios::out|std::ios::trunc);
    if (!
output) return false;
    
output << value.getptr();
    
output.close();
    return 
true;



Comunque tutto il codice che ti ho passato l'avevo scritto facendo un collage di pezzi di codice presi da tutorial vari e sistemandolo alla buona.
Se vuoi usarlo davvero dovresti dargli una sistemata, soprattutto alla gestione dei puntatori.
PhysX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Avio: contratto da 40 milioni di € da ES...
Claude Sonnet 4.5, il nuovo modello di A...
Silent Hill f è un successo: gi&a...
Nuova Jeep Compass: aperti i preordini p...
La PS5 Slim con SSD più piccolo s...
Zero combustibili fossili e controllo qu...
Corsair NAUTILUS 360 RS LCD: raffreddame...
Nuovo record nel mondo dei computer quan...
Sony e Universal combatteranno l'IA con....
Il Chips Act europeo attuale è un...
OnePlus 15: debutto globale con design '...
Amazon Prime: addio alla prova gratuita ...
Windows 11 25H2: guida passo-passo per l...
ECOVACS Deebot Mini sotto i 300€, robot ...
USA chiedono a Taiwan di produrre chip i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:40.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v