Torna indietro   Hardware Upgrade Forum > Software > Programmazione

FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III è la nuvoa fotocamera mirrorless pensata per chi si avvicina alla fotografia e ricerca una soluzione leggera e compatta, da avere sempre a disposizione ma che non porti a rinunce quanto a controllo dell'immagine.
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Da Las Vegas, la visione di Larry Ellison e la concretezza di Clay Magouyrk definiscono la nuova traiettoria di Oracle: portare l’intelligenza artificiale ai dati, non i dati all’intelligenza, costruendo un’infrastruttura cloud e applicativa in cui gli agenti IA diventano parte integrante dei processi aziendali, fino al cuore delle imprese europee
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Dalla precisione estrema dei componenti alla gestione digitale dei processi: come la piattaforma ServiceNow consente ad Aston Martin Aramco Formula One Team di ottimizzare risorse IT e flussi operativi in un ambiente dove ogni millesimo di secondo conta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-12-2008, 20: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 20:13.
borelg è offline   Rispondi citando il messaggio o parte di esso
Old 21-12-2008, 22: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 11:14.
PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2008, 14: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, 18: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, 12: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, 12: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, 13: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, 13: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, 13: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, 14: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 14:14.
PhysX è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2008, 09: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, 13: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


FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1 Micron e millisecondi: la piattaforma ServiceNow...
ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme ASUS GeForce RTX 5080 Noctua OC Edition: una cus...
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Il nuovo M5 fa la differenza anche nel g...
Le AirPods ora sono in grado di rilevare...
Oggi su Amazon succede di tutto: sconti ...
'Copilot Gaming mi spiava!': le accuse d...
Mova P50 Pro Ultra, robot aspirapolvere ...
Speciale action cam: doppio sconto solo ...
Eureka J15 Ultra conquista Amazon: aspir...
Game Pass è sempre più ric...
20 milioni di utenti contro Apple: grand...
La sonda spaziale europea ESA JUICE &egr...
La capsula Orion Integrity è stat...
Intel Nova Lake: i driver Linux svelano ...
Nothing punta sulla fascia bassa: ecco c...
Redmi Watch 6 è ufficiale: si pre...
Arriva Snapdragon 6s Gen 4: l'obiettivo ...
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: 21:31.


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