Visualizzazione post con etichetta Visual Studio. Mostra tutti i post
Visualizzazione post con etichetta Visual Studio. Mostra tutti i post

giovedì 14 febbraio 2008

[C++]WinSock tutorial: un po' di link

Nelle settimane passate ho buttato giù la stesura del server in C++. Ad ogni modo ho approfondito blandamente le funzioni di Winsock. Per questo dopo una quasi esaustiva ricerca su Google,presento qui i migliori tutorial trovati in rete.
I criteri di scelta si basano essenzialmente:

  • sulla versione di Visual Studio usata: tutorial che fanno uso di versioni troppo vecchie non sono stati considerati;
  • rilevanza di posizionamento secondo Google;
  • presentazione abbondante di codice;

Links

Altri link che intendo approfondire sono:

domenica 10 febbraio 2008

[C++ / Visual Studio 2005] Nota sulle direttive #include

Se nel vostro listato inserite #include <fstream.h> all'inizio VS2005 si lamenterà del fatto che non trova tale file. Invece se mettere #include "fstream" VS2005 è contento e trova l'header. Perchè? Mi risponde Igor Tandetnik:

The difference is likely not in angle brackets vs quotes. Note how in one case the file name is fstream.h, and in the other it's just fstream.
The former was used in VC6 and earlier, was deprecated in VC6 and was removed in subsequent version. The latter (fstream without an extension) is modern, standard-conformant header file name.

In buona sostanza #include "fstream" è la sintassi moderna e corretta di includere gli header,anche se non mi è chiaro perchè a questo punto una #include "winsock2" fallisca,mentre #include "winsock2.h" invece no...misteri di Visual Studio :)

Fonte: microsoft.public.vc.language

giovedì 7 febbraio 2008

[C++] La classe basic_string: minitutorial

Introduzione

Nel mio progetto di tesi,faccio uso di stringhe di caratteri per l'invio di comandi e il confronto fra stringhe.
Venendo dal mondo Java,ho fatto un po' di fatica ad orientarmi su come vengono trattate le stringhe in C++ (con particolare considerazione all'ambiente Visual Studio).
A seguire alcune considerazioni sulla classe basic_string.

Sprazzi di codice

Quanto segue è la creazione di una stringa e il confronto fra stringhe, prendendo in input una stringa digitata dall'utente. Il confronto viene fatto sia tramite l'operatore "==" sia tramite compare che ritorna 0 se le stringhe sono uguali:

string myString("partenza");
string passwd;

cout << "Stringa: \"" << myString << "\"" << endl;
cout << "Lunghezza stringa: " << myString.length() << endl;

cout << "Scrivi una stringa: ";
getline(cin, passwd, '\n');
if(passwd == "partenza") {
cout << "Usato \"=\": OK" << endl;
}
if(passwd.compare(myString) == 0){
cout << "Usato \"compare\": OK" << endl;
}
Osserviamo ora il seguente confronto:
string newString("getttnversion\r\n");
string another("getttnversion");
cout << "Confronto fra stringhe con caratteri di escape: " << endl;
cout << " - ";
if(newString.compare(another) == 0)
cout << "Risultano uguali\n" << endl;
else cout << "Risultano diverse\n" << endl; // risulteranno diverse!
Le stringhe risultano diverse! Per ragioni di esigenza,quando passo una stringa di caratteri dal client in java,la faccio terminare con un "\n",pensando che recv interpreti la cosa come la fine del messaggio (anche se non ho ben capito su che basi recv determini che il client ha smesso di inoltrare dati...).
Segue quindi una funzione "purificatrice" per le stringhe: rimuovo gli spazi,i carriage return e i line feed:
void cleanString(string *aString) {
for(size_t i = aString->find(" ", 0); i != aString->npos; i = aString->find(" ", i)){
aString->erase(i,1);
}
for(size_t i = aString->find("\n", 0); i != aString->npos; i = aString->find("\n", i)){
aString->erase(i,1);
}
for(size_t i = aString->find("\r", 0); i != aString->npos; i = aString->find("\r", i)){
aString->erase(i,1);
}
}

// come si usa...
cleanString(&anotherString);
In questo modo anotherString verrà ripulita di spazi e dai caratteri '\r' e '\n'. Se qualcuno sa spiegarmi nel dettaglio:
  • come fa recv a determinare la fine dei dati spediti;
  • se aspetta all'infinito oppure scade dopo un timeout;
Mi farebbe un bel piacere :)

venerdì 1 febbraio 2008

[Vista] Abilitare la connessione alla rete per l'emulatore di Visual Studio 2005

Se provate a far riconoscere a Windows Mobile Device Center (da ora WMDC) l'emulatore di Visual Studio 2005 perdete tempo. L'emulatore integrato in Visual Studio SP1 non viene riconosciuto da WMDC. Di solito se cercate di fare un "bind" alla vostra scheda di rete riceverete un errore che vvi inviterà a scaricarvi Virtual PC 2007.

Ma la sua installazione non risolverà il problema. Il problema viene risolto dall'installazione di Device Emulator 2.0. A questo punto:

  • nelle impostazioni di connessione di WMDC specificare "DMA" dal menu a tendina per "Consenti connessioni a uno dei seguenti dispositivi";

dma

  • Da Visual Studio andare su "Tools" > Device Emulator Manager e selezionare un'immagine di un dispositivo. A questo punto con il destro cliccare su Connect. Si avvierà il pocket PC e a fianco dell'immagine nel DEM si vedrà una sorta di freccina verde che ricorda il tasto "Play" dei videoregistratori.
  • Cliccare con il destro di nuovo sull'immagine prescelta e selezionare "Cradle". Questo farà avviare il riconoscimento dell'emulatore da parte di WMDC e ne avrete conferma con il cambio dell'immagine play con un'altra (vedi foto sotto).

cradle

  • specificate un nome per il dispositivo in WMDC e configuratelo per la sincronizzazione (optional) di files e quant'altro.

Messaggi di debug in applicazioni per PDA

Grazie ai vari consigli è finalmente saltata fuori una funzione che permette di dare maggior significato alle parti del programma:

Questa funzione farà comparire nella finestra output per il Debug ciò che abbiamo scritto.

Certo,si potrebbero usare i breakpoints,ma quelli ancora non li ho mai usati in Visual Studio :D

Ricordarsi sempre di guardare la voce "Requirements" in fondo alle funzioni citate nella libreria online di MSDN: questo ci dice quali header importare e quali librerie linkare per il nostro progetto.

mercoledì 30 gennaio 2008

Programmare con le Socket per PDA: atto I

Se sei un programmatore esperto di C++ e conosci bene i meccanismi di Visual Studio,prova a tornare ai tempi in cui non ci capivi un cazzo e alle frustrazioni che ti dava il linker che non ne voleva sapere di "risolvere" certe funzioncine a te care.

Beh in questi due giorni mi son sentito così,finchè finalmente qualche anima pia ha saputo indicarmi la "cosa giusta".

Ormai mi incollerò come una zecca al forum Smart Devices Native C++ Development.

Quindi in parole povere per lavorare con le Socket su Pocket PC:

  • mettete un bell' #include <winsock.h> in cima al file;
  • Linkate la liberia "ws2.lib" nelle proprietà del vostro progetto oppure usando l'istruzione
    #pragma comment (lib, "WS2.lib")

Per il momento è tutto quello che c'è da sapere. Una buona guardata all'SDK Documentation credo sarà di rigore. Tale documentazione riguarda:

The documentation applies to the following Windows Mobile software platforms:

  • Pocket PC 2003 Second Edition
  • Smartphone 2003 Second Edition
  • Pocket PC 2003
  • Smartphone 2003
  • Pocket PC 2002
  • Smartphone 2002
  • Pocket PC 2000

Con questo chiudo e che Dio me la mandi (buona!!).

mercoledì 23 gennaio 2008

Hello World per Pocket PC

Non poteva mancare l'immancabile appuntamento dell'"Hello World" con il giocattolo con cui gioco al momento.

I passi per ottenerlo

Prima di tutto sto utilizzando Visual Studio 2005 Professional (che possiede gli emulatori per Pocket PC 2003 e Smartphone) e Windows Vista.

  • Aprire Visual Studio 2005 Professional e fare File > New > Project;
  • Ampliare Visual C++ e selezionare Smart Device;
  • Ci si presentano dei template per Smart Device:
    - ATL: a project for Windows Mobile and other Windows CE-based devices that uses the Active Template Library;
    - MFC: an application for Windows Mobile and other Windows CE-based devices that uses the Microsoft Foundation Class Library;
    - Win32: a Win32 or Console project for Windows Mobile and other Windows CE-based devices;
    - MFC ActiveX: an ActiveX control for Windows Mobile and other Windows CE-based devices that uses the Microsoft Foundation Class Library;
    - MFC DLL: a dynamic-link library for Windows Mobile and other Windows CE-based devices that uses the Microsoft Foundation Class library;
  • Sclego Win32 Smart Device - e flaggo Window come tipo di applicazione;

A questo punto siccome abbiamo selezionato "Window",VS ci sparerà dentro il nostro progetto una vagonata iniziale di codice per la gestione degli eventi,le finestre,ecc. Ma all'osso com'è un programma per dispositivi Windows CE based?



#include "stdafx.h"
#include "ppc-hello5.h"
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstan,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
/* printf ("Hello World\n"); verrebbe visualizzato solo su console
non dall'emulatore nè dal pocket pc */
MessageBox (NULL, TEXT ("Hello World"), TEXT ("Hello2"), MB_OK);
return 0;
}


Potete riconoscere una specie di main e una funzione intuitiva: aprirà una finestrella con scritto "Hello World" e un bottone OK per chiuderla:





helloworld




Note



Se notate ho commentato una printf. Se usate funzioni per stampare in output su Consolle (così come cout) il Pocket PC (e l'emulatore stesso non daranno segni di vita al suo avvio. Questo perchè non c'è il supporto per la consolle. Ma se vi scaricate i Windows Mobile Developer Power Toys potete installare una shell sul vostro pocket pc. E' scritto tutto nel readme,basta spostare una dll nella directory di Windows e due eseguibili dove volete e cliccare su cmd.exe per aprire una shell posizionata in partenza sulla root del dispositivo.

domenica 20 gennaio 2008

TomTom: raccolta appunti

Ho aperto una pagina sul mio sito d'appunti per raccogliere tutto il materiale di lavoro per la tesi inerente all'uso di TomTom Navigator 6 e del suo SDK.

Inutile dire che se conoscete siti in cui si parla di programmazione con questo SDK,avete a disposizione qualche materiale a riguardo o volte darmi un qualsiasi tipo di aiuto,SIETE PIU' che benvenuti :-)

Del resto io mi sto approcciando all'argomento da TOTALE inesperto quanto a programmazione C++/Visual C++ e all'uso di Visual Studio stesso.

domenica 13 gennaio 2008

Visual Studio e le espressioni regolari

Visual Studio non sembra seguire gli standard per le espressioni regolari ma ha dei suoi shortcuts particolari. Nei link sottostanti viene esteso l'argomento:

venerdì 11 gennaio 2008

Macro in Visual Studio per formattare e pulire sorgenti importati da fonti esterne

Preambolo

Come già detto forse in alcuni post,mi sto leggendo "Teach yourself ANSI C++ in 21 days", ISBN 0-672-30887-6 , J.Liberty, J.Hord - SAMS Publishing (1996).
In questo libro ben fatto sono presenti numerosi programmi (trovate la lista di quelli che ho fatto io qui),ma dal momento che il libro è in formato PDF,mi tocca andare di CTRL+C per copiare il codice dal PDF e importarlo in Visual Studio.
Qui sorge lo sbattimento di ripulire il codice sorgente da alcune cosette presenti nella versione PDF. A seguire una macro che farà proprio questo,dovrete poi modificare solo l'espressione regolare a seconda di quello che dovete fare.

Presentazione del problema

Un programma nel PDF menzionato sopra,si presenta così:

code
Fig 1

Quando viene importato in Visual Studio si presenta così:

code2

Fig 2

L'immagine Fig 2 non è il corrispettivo di Fig 1 ma rende l'idea dello schifo generato: un codice non formattato,con la presenza di numeri di linea da scartare e con la possibile presenza di caratteri spurii come ” e via dicendo.

Creazione della macro

Siccome non conosco il Visual Basic e le svariate API che regolano l'uso delle macro in Visual Studio,ho usato lo strumento di registrazione delle macro (Tools -> Macros -> Record Temporary Macro oppure Ctrl+Shift+R).

I comandi che seguono verranno registrati dalla macro:

  • Edit -> Find and Replace -> Replace in Files. Cliccare sul + di Options e flaggare "Use" scgliendo dal menu a tendina "Regular Expression". In "Look In" scegliere "Current Document";
  • In "Find what" inserire l'espressione regolare che ci serve. Per me: prima tratto i numeri di linea inserendo in "Find What" ^:z\: e in "Replace with" nulla. Se ci sono altre sostituzioni da fare ripetere il passaggio.
  • Chiudere la finestra di "Find and Replace";
  • Riportiamo il focus sul codice sorgente e premere CTRL+A e poi CTRL+F / CTRL+K in sequenza uno dopo l'altro. Questi comandi rispettivamente selezionano tutto il codice e lo indentano per bene (ci sono ovviamente le rispettive voci di menu). Salviamo il file.
  • Stoppare la macro;

In questo modo abbiamo il codicep rincipale per una macro funzionante su UN SOLO E BEN PRECISO FILE: quello su cui stavamo lavorando. Ma se volessimo che la macro funzionasse per tutti i file su cui stiamo lavorando?

Purtroppo Visual Studio registra che abbiamo reso attiva la finestra con il codice del nostro programma e traduce pedissequamente. Dobbiamo editare la nostra macro. Io non conoscendo bene le API ho fatto si che venisse richiesto il nom del file da editare e in questo modo la macro funziona. Ecco la macro finale:

Sub PulisciCodice()
Dim nomefile As String
nomefile = InputBox("Come si chiama il file da pulire?", "MACRO PULIZIA FILE")
If nomefile = "" Then
MsgBox("Non hai immesso alcun valore,la macro esce.")
Exit Sub
End If
DTE.ExecuteCommand("Edit.ReplaceinFiles")
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Activate() 'Find and Replace
DTE.Windows.Item(Constants.vsWindowKindMacroExplorer).Activate()
DTE.Find.FindWhat = "^:z\:"
DTE.Find.ReplaceWith = ""
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.MatchInHiddenText = True
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResults1
DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
Throw New System.Exception("vsFindResultNotFound")
End If
DTE.Windows.Item("{CF2DDC32-8CAD-11D2-9302-005345000000}").Close()
DTE.Windows.Item(nomefile).Activate()
DTE.ActiveDocument.Selection.SelectAll()
DTE.ExecuteCommand("Edit.FormatSelection")
DTE.ActiveDocument.Save()
End Sub
Salvate pure questa macro. L'unica cosa che non son riuscito a fare è l'uso dell'espressione regolare per il carattere “ poichè Visual Studio lo interpreta come un uguale. Chiederò su GoogleGoups. Si ringrazia Guido per il breve consulto su Visual Basic.

martedì 18 dicembre 2007

Tom Tom SDK: si parte

tomtom_small

Finalmente è arrivato Tom Tom SDK da non so dove e si può cominciare a spippolare per vedere come interagire con il software di navigazione.

The TomTom SDK allows developers to create Pocket PC applications which can communicate with TomTom NAVIGATOR.

The communication between the two applications functions through a client/server model, where TomTom NAVIGATOR acts as a server receiving commands from the client application and sending back results when possible. The commands are written in message files and sent to the navigation application, which will send back responses written in other files.

Per prima cosa specifico cosa sto usando:

Detto questo vediamo come utilizzare gli esempi posti nella directory examples dell'SDK. Innanzitutto rendiamo la directory scrivibile (io l'ho trovata con i permessi in sola lettura).
Dopo di che facciamo doppio click sul file Simpleclient.vcp. Questo progetto è presente nella directory degli esempi dell'SDK. Quest'estensione indica i vecchi progetti di Visual C++,perciò al doppio click su questo file,ci apparirà un wizard che ci chiede di converitre il progetto per Visual C++.NET 2005.

screen1

A questo punto fate Build -> Build solution per compilare il progetto, specificando come profilo di debug Pocket PC 2003. Una volta ottenuto l'eseguibile,spostarlo nella Storage Card del vostro dispositivo e fare doppio click per avviarlo (sempre dal vostro dispositivo). Io ho provato anche a farne il debug con l'emulatore ed effettivamente il programma sembra funzionare,anche se ovviamente non potremo ricevere i dati come se avessimo il TomTom installato con GPS.

screen2

L'analisi del codice di questo e/o di altri programmi nelle prossime puntate.

domenica 2 dicembre 2007

L'Hello World in C++ e Visual C++

Come già preannunciato,mi tocca imparare per lo meno le basi di C++ per poter lavorare alla tesi. Ebbene sto leggendo un libro un po' datato,ispirato dal titolo: "Teach yourself ANSI C++ in 21 days",0-672-30887-6, J.Liberty, J.Hord - SAMS Publishing (1996). Il primo esempio di codice mi riserva subito dei problemi con Visual Studio:


#include "iostream.h"

void main()
{
cout << “Hello World!\n”; }
Di fatto non riconosce "cout",proprio come se la libreria non fosse stata importata. Girovagando per la rete,per rendere compatibili i programmi con il compilatore Microsoft,bisogna usare questo codice:

#include "stdafx.h"
#include "iostream"

using namespace std;

/* per rendere compatibile il normale codice c++
* in VS bisogna anteporre le librerie e il namespace
* messi qui sopra */
void main() {
cout << "Hello World!\n"; }
Mi raccomando di mettere "stdafx.h" prima di ogni altra cosa poichè il compilatore ignora qualsiasi cosa anteposto a questa stringa.

martedì 27 novembre 2007

Visual Studio 2005 e l'errore "il server di automazione non può creare l'oggetto"

Oggi è stata la giornata dedicata al troubleshooting. Tra i miei svariati problemi avevo l'impossibilità di creare nuovi progetti Visual C++: all'atto della creazione,una nefasta finestrella di errore mi precludeva il coding:

Le ricerche son state lunghette e alla fine ho trovato la soluzione al problema. Al fine di evitare anche ad altri il tormento di ricercare le varie possibili soluzioni,riporto tutte quelle che ho trovato,sperimentatele tutte,la mia soluzione vincente su Vista è stata l'ultima postata qui sotto.
  • Il supporto di Microsoft indica di scaricare la versione 5.6 di Windows Script. Gran parte delle dll presenti sono più vecchie di quelle che avevo già installate e ciò non ha risoolto il mio problema;
  • Ho cercato la stringa dell'errore nel suo equivalente inglese:"Automation server can't create object". Nel forum di MSDN viene indicata una chiave di registro da modificare,ma purtroppo tale chiave su Vista non c'era...
  • Infine su un sito di cui ho appena perso il link ho trovato che un tipo registrava la seguente dll da "Esegui": regsvr32.exe scrrun.dll. Il tutto poi ha funzionato :)

giovedì 25 ottobre 2007

Visual Studio tips

Come è possibile formattare il codice copiato-incollato dentro Visual Studio?

- Selezionare tutto il codice e poi Edit > Advanced > format Selection. (fonte)

Come faccio a passare degli argomenti del main in Visual Studio?

- Selezionare il nodo del progetto nella Solution Explorer,dopo di che andare nel menu Project > nomeapplicazione properties > Debug tab > Command line arguments. (fonte)