Newsgroup: it.comp.lang.c++
Titolo: ShellExecute

Ciao a tutti!
Sono Marco Micheletti, e ho appena iniziato a usare il C++, ho
intenzione di studiarmelo un po' prima di "rompervi" le scatole, però
adesso ho bisogno subito di sapere come fare una autorun semplice,
insomma che usi la funzione ShellExecute. Siccoem non so proprio nulla
di c++, qualcuno mi potrebbe per favore inviare un esempio di
ShellExecute che mi apra una pagina html da me specificata come
argomento (parametro). Io lo so fare in Visual Basic, ma non ho idea
di come farlo in C++.
Per favore,
Grazie
Marco Micheletti

di come farlo in C++.
Questa e` piu` o meno la versione minimale di
quel che richiedi (24k in link statico, 16k col piu`
normale link dinamico -- la presenza di MSVCRT.DLL,
richiesta dal link dinamico, e` infatti garantita sul
directory di sistema; la granularita` di 4k per
pagina non permette EXE troppo piccole...):
#include <windows.h>
int APIENTRY
WinMain(HINSTANCE, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
    return ShellExecute(0,0,lpCmdLine,0,0,nCmdShow) <= (HINSTANCE)32;
}
Questa, compilata e linkata come pippo.exe, si usa,
o da linea comandi un po' come la start inclusa col
sistema - se l'hai nella PATH, ad esempio:
    C:\ > pippo c:\windows\readme.htm
o facendone un'icona su desktop e trascinandoci su
l'icona del file che vuoi aprire, ecc ecc.  Ritorna
anche un corretto ERRORLEVEL (0 se OK, 1 se
ha errori) se vuoi usarla in un .BAT (fidando sul
fatto documentato che ShellExecute torna codici
<=32 per tutti i vari possibili errori), e usandola
come icona, _prova_, almeno, a passare il codice
di "Run as" (normale, minimizzata, ecc) -- anche
se IE4, su Win98, lo ignora e parte comunque come
vuole lui, altre applicazioni potrebbero essere piu`
cortese (il codice di "Run as" e` codificato dal
parametro nCmdShow).
Per le istruzioni di compilazione e link, gli switch da
passare al tuo compilatore C++, ecc, e` impossibile
suggerirti alcunche` senza sapere che compilatore
C++ hai scelto di usare...
Alex

C++ hai scelto di usare...
Grazie sei stato molto gentile. Io uso il Visual C++ 5.0 di MS, e mi
dice che ci sono 3 errori, non riesco a compilarlo. dice che è
impossibile riconoscere un carattere, dovrebbe essere 0xx0 o roba del
genere.
Ciao
Marco Micheletti

impossibile riconoscere un carattere, dovrebbe essere 0xx0 o roba del
Di quale carattere stai parlando...?  Ripeto il codice totale
del programma che pare causarti problemi:
+++inizio
#include <windows.h>
int APIENTRY
WinMain(HINSTANCE, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
    return ShellExecute(0,0,lpCmdLine,0,0,nCmdShow) <= (HINSTANCE)32;
}
+++fine
Non vedo nessuna '0xx0' ne` nulla del genere.  Hai istallato
bene il compilatore?  Come "tipo di progetto", stai usando
"Win32 Application"?
Alex

}
L'ho provato e funziona perfettamente, ma mentre scrivevo il codice sotto
visual c++ 5
vedendo alcuni esempi nell'help mi sono chiesto quale sia la differenze
sostanziale nell'utilizzare i diversi tipi di ritorno della WinMain.
Come ad esempio     int PASCAL WinMain(....
e                              int APIENTRY WinMain(....
ecc..
Ciao
Terenzio

e                              int APIENTRY WinMain(....
Non sono diversi tipi di ritorno (il tipo di ritorno e` comunque int),
ma diversi sinonimi (uno obsoleto, PASCAL, l'altro quello che la
Microsoft suggerisce oggi di usare, APIENTRY -- ce ne sono altri
ancora!) per la "convenzione di chiamata standard" (quella che
usano normalmente tutti i linguaggi, salvo C e C++), che, in VC++,
puoi anche denominare con la keyword (estensione allo standard,
corretta in quanto inizia con sottolineature) "__stdcall" (e, tra
l'altro, anche in vari altri modi).
Non fa differenza sostanziale quale sinonimo tu usi, io pero`
suggerisco APIENTRY per essere allineati con gli attuali manuali
della Microsoft.
Alex

ma non mi funziona.
Si effettivamente operando cosi non funziona, perchè l'ambiente non è
impostato in maniera corretta e non perchè il codice è scorretto.
Devi creare un nuovo progetto File New, andare nel tab Projects ed
utilizzare Win32 Application, a questo punto hai impostato un workspace
corretto.
Quindi aggiungi un file sorgente in cui incolli il codice di Alex ed il
tutto funziona.
Ciao
Terenzio

ma non mi funziona.
A questo punto si dovrebbe entrare nei dettagli della tua
istallazione di VC++5, come hai configurato il progetto in
questione prima di "aprire un nuovo foglio C++" (dovrebbe
essere una "Win32 Application", naturalmente -- non
occorre modificare le opzioni di default di questo tipo di
progetto), se il tuo cliente newsreader possa avere dei
problemi nel copy-and-paste, eccetera.  Certo che un
sorgente di un'applicazione Windows, piu` semplice e
corto di quello che ho postato, non lo incontrerai mai
(UNA riga di codice...!).  Il messaggio d'errore (di cui
non hai dato completi dettagli nel tuo post precedente)
parlava di un carattere strano e misterioso (che, coi
tuoi occhi puoi agevolmente vederlo, non esiste nel
sorgente che ho postato), il che induce a dubitare della
correttezza dei copy-and-paste, oppure a pensare a
versioni danneggiate dei tuoi file d'include di sistema (il
messaggio d'errore completo dice certamente DOVE si
rileva il problema, quindi puoi almeno dirimere la questione:
lo vede negli header, o in quel minuscolo sorgente?).
Alex

lo vede negli header, o in quel minuscolo sorgente?).
Io ho seguito tutte le vostre indicazioni, ho poi aggiunto un c++
source file
e ho copiato il codice. Quando ho detto Build ShellMarco mi ha
segnalato 
questi errori:
--------------------Configuration: ShellMarco - Win32
Debug--------------------
Compiling...
shell.cpp
D:\Programmi\DevStudio\MyProjects\ShellMarco\shell.cpp(6) : error
C2018: unknown character '0xa0'
D:\Programmi\DevStudio\MyProjects\ShellMarco\shell.cpp(6) : error
C2018: unknown character '0xa0'
D:\Programmi\DevStudio\MyProjects\ShellMarco\shell.cpp(6) : error
C2018: unknown character '0xa0'
Error executing cl.exe.
ShellMarco.exe - 3 error(s), 0 warning(s)
Pensando di aver installato male il vc++5 l'ho rinstallato e mi da gli
stessi errori.
Grazie
Marco Micheletti

...
    [snip]
Le diagnostiche che riporti ti dicono che alla linea 6 del tuo
file di testo si trova, tre volte, il carattere '0xA0' (esadecimale
equivalente a 160 in decimale); vedrai, ad esempio con la
utility "mappa di caratteri" di NT, che a questo carattere di
codice "strano" corrisponde una rappresentazione che
sembra un "bianco", ma, evidentemente, non e` invece un
semplice spazio (il codice dello spazio e` 0x20, cioe` 32).
Si tratta, in effetti, di un bianco _piu`_ un bit piu`
significativo settato (0x80 + 0x20).
Presumibilmente, come gia` dicevo, si tratta di problemi
di "copy and paste" fra il programma che usi per leggere
le news, e Visual Studio.  Edita, dunque, questa linea 6;
se non contiene caratteri visibili, cancellala e basta; se
ne contiene, magari, riscrivila "eguale" (per quel che puoi
vedere), cosi` sicuramente di caratteri strani non ce ne
saranno, poi cancella l'originale.
Alex

    [snip]
Grazie 1000 ora funziona!
ciao
Marco