View Full Version : Attesa delle pressione di un tasto in C++
Come posso fare per far si che il programma resti in attesa di un qualsiasi tasto premuto dall'utente ? Non mi interessa il tasto , ma mi serve solo per mettere in pausa il programma . Ho provato anche system ("pause") ma non mi funziona a dovere .
Quale s.o. usi?
Se windows/dos, prova ad usare la funzione getch(). Il programma si ferma in attesa della pressione di un tasto qualsiasi.
Se Linux, potresti sempre usare la medesima funzione, il problema e' che finche' non viene premuto "invio" il programma non proseguira'. Per far si che funzioni con la pressione di un qualsiasi tasto (e non solo invio) bisogna prima del getch() fare una chiamata system(qualcosa) ... purtroppo non ricordo cosa sia il "qualcosa" :(
Bye
Si grazie funziona benissimo . Il S.O è WINDOWS . Mica sapresti anche come stampare da c++ . Mi spiego : hai presente la funzione DOS che stampa ciò che vedi sul video alla pressione del tasto print della tastiera ? Beh ... è un pò la stessa cosa . Ciò che vedo sullo schermo voglio stamparlo da c++ .
Hmmm, modalita' testo o modalita' grafica?
Bye
Originally posted by "bsummer"
Hmmm, modalita' testo o modalita' grafica?
Bye
Modalità testo
Dunque.
Quando vuoi stampare un banalissimo file testo in dos, basta fare una cosa del genere.
Type file > lpt1
Ora, non so se esistano modi piu' semplici cmq io farei cosi':
la memoria video in modalita' testo mi sembra inizia all'indirizzo esadecimale b800 (mi pare).
Da li in poi i bytes sono suddivisi in coppie ( 1 byte attributi del colore, 1 byte codice ascii del carattere, 1 byte colore, 1byte carattere, e cosi' via...). 80 righe x 25 colonne = 2000 bytes per 1 schermata + altri 2000 bytes per gli attributi del colore.
Ti basta fare una funzioncina che legge la memoria video (solo i bytes caratteri), salvare questi dati in un file testo temporaneo e quindi system ("type file > lpt1").
Ed il gioco e' fatto. Se non mi sono spiegato bene, dimmelo che provo a riformulare tutto.
Pero', visto che si tratta di modalita' testo... hai provato se PrtScr non funziona? Sarebbe molto piu' semplice.
Bye
Allora : Ho provato prtscr in questo modo : system ("prtscr") e non va . Per quanto riguarda la funzioncina , come faccio a scandire tutte le locazioni di memoria ? Non conosco le istruzioni . Me la potresti fare tu ?
Prova a leggere qui , ci capisci qualcosa ? L'ho preso da MSDN :
How to Do a Print Screen Within a Program
Last reviewed: July 17, 1997
Article ID: Q59380
5.10 6.00 6.00a 6.00ax 7.00 | 1.00 1.50
MS-DOS | WINDOWS
kbprg
The information in this article applies to:
The C Run-time (CRT) included with:
- Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, and 6.0ax
- Microsoft C/C++ for MS-DOS, version 7.0
- Microsoft Visual C++ for Windows, versions 1.0 and 1.5
SUMMARY
The code below demonstrates how to do a print screen from within a program under MS-DOS. This is done by executing Interrupt 5 within a program.
MORE INFORMATION
The interrupt service directs all its output to the default printer. The print-screen service prints text or graphics. In graphics mode, GRAPHICS.COM must be loaded before invoking the print-screen service.
Interrupt 5 does not return any values but the status code is available at memory location 0050:0000. The values are as follows:
00 No error occurred
01 Indicates that a print-screen operation is in progress
FF The previous print screen was not successful.
Sample Code
#include <stdio.h>
#include <dos.h>
void main (void)
{
int *result;
union REGS inregs, outregs;
/* inregs and outregs are never used but necessary
for the int86 function.
*/
puts("This is a test of prtscr() function.");
int86(0x5, &inregs, &outregs);
result = (int *) 0x00500000;
switch( *result )
{
case 0:
puts("No error occurred.");
break;
case 1:
puts("Print Screen in progress....");
break;
case 0xFF:
puts("ERROR occurred during print screen");
break;
}
}
Cionci mi ha detto di provare a vedere con l'api readconsoleoutput . Ne sai qualcosa ?
Sono 5-6 anni che non faccio piu' ste robe... Ci provo...
char buffer[2000[;
char *p;
p = H0b801;
for (i = 0 ; i<2000; i++) {
buffer[i] = *p;
p+=2;
}
Alla fine dovresti avere tutti i caratteri presenti sullo schermo in "buffer". Ricordati che sono ordinati per riga (cioe' i primi 80 byte sono la prima riga, i secondi 80 la seconda, ecc fino alla 25ma riga).
Non ricordo se i codici ascii dei caratteri si trovano nelle locazioni pari o in quelle dispari.
Nel caso siano nelle pari cambia il valore di p da H0b801 in H0b800 .
A questo punto prendi i caratteri da buffer a gruppi di 80 byte, e salvali su un file di tipo testo .
In quanto alla questione "prtscr". Mi pare che bastava premere il tasto "prt Scr" per avviare la stampa, e che non bisognasse scrivere system("prt scr"). :confused:
Bye
Originally posted by "leon84"
Cionci mi ha detto di provare a vedere con l'api readconsoleoutput . Ne sai qualcosa ?
No, di api non ne consoco. Sorry.
Per quanto riguarda il codice che hai postato, e' un piccolo esempio di come fare la stampa.
E' abbastanza semplice, in quanto non si fa altro che richiamare il gestore di interrupt apposito. L'esito delle operazioni e' visibile tramite un controllo del valore all'indirizzo 0x00500000.
Visto che e' molto piu' semplice questa soluzione, ti consiglerei di provarla. Quella che ti ho fornito io e' un po' piu' complessa.
Bye
Il compilatore mi dà errore nell'assegnazione al puntatore p dell'indirizzo che hai inserito . Io sapevo che non era possibile assegnare un indirizzo al puntatore ma era il compilatore che provvedeva per forza . Sei sicuro che sio possa fare ? A livello logico ho capito come funziona .
Ah scusa .... Mancavano gli apici all'inizio e alla fine dell'indirizzo . Ora provo se la funzione che ho creato insieme alle tue istruzioni funziona .
Originally posted by "leon84"
Il compilatore mi dà errore nell'assegnazione al puntatore p dell'indirizzo che hai inserito . Io sapevo che non era possibile assegnare un indirizzo al puntatore ma era il compilatore che provvedeva per forza . Sei sicuro che sio possa fare ? A livello logico ho capito come funziona .
Mmm, aspetta, ho scritto H0B800... in C l'esadecimale e' 0x0b800 :D
Per quanto riguarda l'assegnamento dei puntatori... in dos puoi assegnare ad un puntatore qualsiasi indirizzo vuoi. Win95/98 non hanno problemi a far girare applicativi dos, Me potrebbe, mentre 2000 e Xp credo s'incazzerebbero non poco.
Provaci, nel caso non ti riesca ti posso spiegare passo per passo cosa fa la funzione che hai postato prima.
Bye
Il problema è che nel buffer[2000] ci va a finire la stringa 0080 . Non vedo nulla dello schermo in quel buffer . Guarda sto codice e tralascia quello commentato
void clinica::stampa_cartacea ()
{
ofstream file ("stampa.txt");
int i;
int j ;
char buffer[2000],buffer2[80];
int cont=0 ;
char *p;
p = "0x0b800";
for (i = 0 ; i<2000; i++)
{
buffer[i] = *p;
p+=2;
}
file << buffer << endl ;
/*for (i=1;i<=25;i++)
{
for (j=0;j<=79;j++)
{
buffer2[j]=buffer[cont];
cont++;
}
file << buffer << endl ;
}*/
file.close();
}
A questo punto aprendo il file di testo ci trovo "0080"
Mmmm.
Ho una memoria di merda... non mi ricordo bene come usare i puntatori.
Allora e' probabile che o ti ho detto male l'indirizzo o ti ho detto male come impostare il puntatore. Guardando per internet mi sono accorto che l'indirizzo che ti ho dato e' un po' corto
Prova a scrivere (senza apici)
p = (char*) 0x0b8000;
Se non ti viene ancora fuori nulla prova con
p =(char*) 0x0b8001;
Fammi sapere.
Bye
Aglia un brutto errore .... In esecuzione all'istruzione buffer[i] = *p viene generato il seguente errore :
:mad:
Mi spiace farti andare a tentativi, purtroppo sono cose che non faccio da diverso tempo.
Riprova con le seguenti assegnazioni
p = (char*) 0x0b800;
oppure
p=(char*)0x0b801;
L' indirizzo 0x0b8000 a quanto pare non e' :mad:
Bye
Purtroppo sempre lo stesso errore
Senti, cancella tutto quello che ti ho detto di fare. Il problema a questo punto penso sia che windows non permette di accedere a zone di memoria non allocate dal sistema operativo, nemmeno in lettura. Come ho già detto con dos e win95 sono sicuro si potesse fare. Anche w98 credo lo permettesse ma già con Me ho dei dubbi. Quale S.O operativo hai?
Cmq, tagliando la testa al toro, prova a fare come hai trovato nell'esempio. L'ho leggermente modificato e ho tradotto in italiano nel caso avessi qualche problema con l'inglese. Se non funziona neppure così, mi spiace non saprei che altro dirti.
#include <stdio.h>
#include <dos.h>
void clinica::stampa_cartacea ()
{
int *result;
union REGS inregs, outregs;
/* chiamata all'interrupt 5. In reg e out reg vanno passati solo perchè la funzione int86 vuole 3 parametri */
int86(0x5, &inregs, &outregs);
/* la funzione non restituisce nessun risultato. Tuttavia si può capire l'esito della chiamata andando a leggere un valore ad una particolare locazione di memoria. Creo quindi un puntatore ad intero indirizzato proprio a tale locazione*/
result = (int *) 0x00500000;
/* possono succedere 3 casi */
while ( *result == 1)
{ /* la stampa è in corso...non faccio nulla */
}
/* a questo punto o la stampa è terminata oppure è successo qualche errore */
if (*result!=0)
{
/* è successo un errore */
} else { /* tutto ok */ }
}
Bye
Originally posted by "bsummer"
result = (int *) 0x00500000;
Ma la provato con Windows 2000/XP ? Perchè non è molte legale per una applicazione Windows una cosa del genere... Scommetto che genera ancora un'access violation...
Il fatto è che lui programma per console e non per DOS (la cosa è diversa)... Magari con una applicazione DOS funziona...
Originally posted by "cionci"
Ma la provato con Windows 2000/XP ? Perchè non è molte legale per una applicazione Windows una cosa del genere... Scommetto che genera ancora un'access violation...
Il fatto è che lui programma per console e non per DOS (la cosa è diversa)... Magari con una applicazione DOS funziona...
Non è da escludere, ma in questo caso potrebbe anche funzionare...
Normalmente, nei sistemi multitasking (come Linux) non è possibile fare un'accesso alla memoria video in quanto ogni applicazione potrebbe fare il bello ed il cattivo tempo sullo schermo...sai che casino...
Però, questo non vieta che vi siano delle zone di memoria il cui accesso (in sola lettura) viene permesso a tutte le applicazioni, e magari il nostro l'indirizzo incriminato è tra questi.
C'è solo da provare ;)
Bye
Ragazzi non ci capisco niente !!!! Mi aiutate a fare sta cosa molto più semplicemente ?
Prova a fare l'ultima cosa che ti ho scritto, cioè la chiamata alla funzione int86.
Se ti dà ancora errore prova a togliere il controllo fatto su result (cancelli tutte le righe che lo riguardano).
Se non funziona ancora, :( mi spiace, ho esaurito tutte le mie idee
Bye
Il problema è che non capisco proprio quelle istruzioni cosa fanno .
Prova con questo codice :
#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;
void MyErrorExit(char *s)
{
cout << "Errore: " << s;
exit(1);
}
void main(void)
{
HANDLE hStdout;
SMALL_RECT srctReadRect;
CHAR_INFO chiBuffer[2000]; //80x25
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;
// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (! hStdout)
MyErrorExit("GetStdHandle");
cout << "Questa e' una prova" << endl << "ciao" << endl << "bau" << endl;
srctReadRect.Top = 0; // top left: row 0, col 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 24; // bot. right: row 1, col 79
srctReadRect.Right = 79;
coordBufSize.Y = 25;
coordBufSize.X = 80;
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
fSuccess = ReadConsoleOutput(
hStdout, // screen buffer to read from
chiBuffer, // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
&srctReadRect); // screen buffer source rectangle
if (! fSuccess)
MyErrorExit("ReadConsoleOutput");
ofstream f("prnfile.$$$");
for(int i=0; i<25; ++i, f << endl)
for(int j=0; j<80; ++j)
f << chiBuffer[j+i*80].Char.AsciiChar;
f.close();
system("type prnfile.$$$ > prn");
Sleep(1500);
DeleteFile("prnfile.$$$");
}
Ho provato il codice . A livello di sintassi è ok infatti compila bene . Ma lo lancio e non mi stampa niente . Non si apre neppure la finestra della stampante .
Potrebbe essere il fatto che la stampante non ha driver sotto dos ?
In pratica con GetStdHandle si preleva l'handle dello standard output...
Con ReadConsolOutput si legge un rettangolo (srctReadRect) di corrdinate (0,0),(79,24) (cioè tutto lo schermo) e lo metto alla posizione (0,0) (coordBufCoord) in un buffer 80x25 (chiBuffer, la cui dimensione è specificata da coordBufSize)...
Il buffer è del tipo CHAR_INFO in cui è specificata sia la caratteristica di ogni posizione (colore di sfondo, colore del testo, se lampeggia) e il carattere contenuto nella posizione (chiBuffer[x].Char.AsciiChar)...
Ora scansiono il buffer (il carattere di posizione j,i è contenuto nella cella j+i*80) e scrivo ogni carattere nel file... Ogni volta che incremento la riga mando anche a capo ilf iel di testo...
Dopo lo stampo ed elimino il file...
Originally posted by "leon84"
Potrebbe essere il fatto che la stampante non ha driver sotto dos ?
Sicuramente !!!
Originally posted by "cionci"
Sicuramente !!!
La stampante è una Canon S400 e driver per dos non ne ha . Ho visto anche sul sito del produttore . Come posso fare ? C'è qualche rimedio . Non posso installargli qualche driver generico ?
Non so cosa dirti...altrimenti dobbiamo percorrere altre strade...
Tempo fa ho stampato del testo in una mia applicazione...guardo di tirarci fuori qualcosa...
Originally posted by "cionci"
Non so cosa dirti...altrimenti dobbiamo percorrere altre strade...
Tempo fa ho stampato del testo in una mia applicazione...guardo di tirarci fuori qualcosa...
Ok .. Grazie cionci . Metticela tutta perché mi interessa sul serio
Ecco qua:
#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;
void MyErrorExit(char *s)
{
cout << "Errore: " << s;
exit(1);
}
void main(void)
{
HANDLE hStdout;
SMALL_RECT srctReadRect;
CHAR_INFO chiBuffer[2000]; //80x25
COORD coordBufSize;
COORD coordBufCoord;
BOOL fSuccess;
// Get a handle to the STDOUT screen buffer to copy from and
// create a new screen buffer to copy to.
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (! hStdout)
MyErrorExit("GetStdHandle");
cout << "Questa e' una prova" << endl << "ciao" << endl << "bau" << endl;
srctReadRect.Top = 0; // top left: row 0, col 0
srctReadRect.Left = 0;
srctReadRect.Bottom = 24; // bot. right: row 1, col 79
srctReadRect.Right = 79;
coordBufSize.Y = 25;
coordBufSize.X = 80;
coordBufCoord.X = 0;
coordBufCoord.Y = 0;
fSuccess = ReadConsoleOutput(
hStdout, // screen buffer to read from
chiBuffer, // buffer to copy into
coordBufSize, // col-row size of chiBuffer
coordBufCoord, // top left dest. cell in chiBuffer
&srctReadRect); // screen buffer source rectangle
if (! fSuccess)
MyErrorExit("ReadConsoleOutput");
string txtBuf;
PRINTDLG pd;
DOCINFO di;
ZeroMemory(&pd,sizeof (PRINTDLG)) ;
pd.lStructSize = sizeof (PRINTDLG);
pd.Flags = PD_ALLPAGES | PD_COLLATE | PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | PD_HIDEPRINTTOFILE | PD_NOSELECTION;
pd.nCopies = 1;
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Stampa orario";
di.lpszOutput = NULL;
di.lpszDatatype= NULL;
di.fwType = 0;
if(PrintDlg(&pd)!=0)
{
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
//modifica il 55 per regolare la stampa verticale (per avvicinare le linee)
int cy = ::GetDeviceCaps(pd.hDC, VERTRES)/55;
int y = 0;
for(int i=0; i<25; ++i)
{
txtBuf = "";
for(int j=0; j<80; ++j)
txtBuf += chiBuffer[j+i*80].Char.AsciiChar;
TextOut(pd.hDC, 0, y+=cy, txtBuf.c_str(), txtBuf.length());
}
EndPage(pd.hDC);
EndDoc(pd.hDC);
}
DeleteDC(pd.hDC);
}
Grandissimo !!! Hai utilizzato il driver di windows ? Soltanto una cosa : "Questa è una prova " mi è uscito scritto tutto attaccato . Come mai ? Ah... Cionci .. senti qua : ho dichiarato una variabile intera o reale . Quando il programma è in esecuzione l'utente potrebbe inserirmi un carattere quando io sto leggendo invece un intero . Questo genererebbe ub bel errore . C'è un metodo per ovviare ? Grazie ancora per stampa . Sei grande !!!
Perchè ho sbagliato... Aspetta... Correggo il listato sopra...
Ok ora va bene . Non oggi , magari domani , potresti spiegarmela passo passo questa funzione ? Per quanto riguarda il fatto della variabile ?
C'è un metodo per ovviare, ma c'è molta teria del C++ dietro...
Si chiamano eccezioni...
Cmq ho integrato la funzione nel mio programma e funziona benissimo . Non so come ringraziarti . Per quanto riguarda le eccezioni volendole implementare occorrono diverse istruzioni ? Tanto della teoria oggi proprio non mi importa .
Il problema è che non è facile da spiegare...
try {
cin >> pippo;
if(!cin)
throw("inserimento errato");
}
catch(const char *e) {
cout << "Errore : " << e << endl;
}
Vabbè per ora lasciamo stare ... Sei stato gentilissimo . Ma tutte queste cose le hai imparate da te o all'università ? Io sto frequentando il 5° anno di superiori (indirizzo informatica) e sono convinto di proseguire con ingegneria informatica . Mi dai qualche consiglio ?
Scusa , mi potresti dire cosa è un namespace ? Devo inserirlo nella relazione al programma . Anzi mi faresti un piacere se mi dicessi proprio cosa scrivere . Poche righe nient'altro
Un namespace può contenere al suo interno la definizione di classi, funzioni o variabli.
Con using namespace si rendono visibili direttamente nel file le strutture in esso contenute altrimenti visibili solamente tramite il namespace (nomedelnamepsace.struttura da utilizzare)...
Io ho imparato più che altro da solo...
Riguardo all'università se ti piace la matematica va bene ingegneria informatica...se non ti piace vai ad informatica...ce n'è un po' meno...
Non posso dire che la matematica non mi piace ma non mi attira più di tanto . Ma oltre ad analisi riguardo ai pc cosa si fà ? voglio dire programmazione , hardware , ci sono dei rami specifici ?
Ieri purtroppo abbiamo giocato troppo con i puntatori tentando di leggere aree riservate . E sapete cosa è successo ? Stamattina ho acceso il computer e winxp con una schermata blu iniziale mi ha informato che il computer è stato bloccato per evitare ulteriori danni all'hardware . E l'errore era proprio l'accesso violato alla locazione 0x0000000005 la stessa che provocò l'errore di accesso violato in c++ . Per fortuna ora il pc si è ripreso .
Originally posted by "leon84"
Non posso dire che la matematica non mi piace ma non mi attira più di tanto . Ma oltre ad analisi riguardo ai pc cosa si fà ? voglio dire programmazione , hardware , ci sono dei rami specifici ?
Per matematica non intendo solo analisi I e II...ma molte altre materie che hanno nella matematica punti fondamentali : Fisica I e II, Teoria dei Segnali, Elettronica, Elettrotecnica, Teoria dei Sistemi, Calcolo Numerico, Geometria e Algebra ed altre...
Riguardo ai PC si fa tutto...ovvero si comincia imparando C++, Java (io non l'ho fatto) e PHP...poi si passa a fare qualcosa di più serio sugli algoritmi...algoritmi genetici, reti neurali (una figata, io ci ho fatto una specie di OCR), algoritmi di compressione e di codifica.
Si fa molto sull'hardware si parte dalle porte logiche fino ad arrivare a come sono composte le interfacce...poi varie teorie sui processori...
In una materia in pratica ti insegnano a scrivere il kernel di un minisistema operativo a 32 bit (in assembler)...
Poi ci sono tutte le teorie di programmazione sui sistemi operativi, sulle reti (TCP/IP) e su come sviluppare software...
Un mucchio di teoria sulle basi di dati e come lavorano...ovviamente SQL...
Sicuramente mi sarò scordato qualcosa....
Allora mi interessa parecchio ... Il mio problema è sempre stato quello di avere una certa passione per l'informatica ma che non si debba ridurre ai soli linguaggi di programmazione . Mi piace infatti assemblare pc e conoscere i funzionamenti dei suoi componenti . Ultimamente mi sono interessato alle reti informatiche e anche a linguaggi come asp e php . L'elettronica pure mi piace e quindi credo che farò ingegneria . Ma la differenza con la facoltà di informatica qual'è ? Ah... ma dove frequenti l'università ?
Pisa...
La differenza sta proprio nell'elettronica, nell'elettrotecnica e nelle materie teoriche sui sistemi (in generale, non infomatici)...
Ed in generale l'approccio degli informatici è di più alto livello rispetto a quello di ingegneria... Probabilmente faranno meglio e più linguaggi, ma come hai detto te si riducono principalmente alla programmazione ad alto livello...
Ma alla Normale di Pisa ?
Per quanto riguarda le API . So o credo di sapere cosa sono e ce ne sono di diverse . Il problema è dove è possibile trovare una guida per ognuna di esse ? E cosa è un handle ?
Alla Normale di Pisa non c'è ingegneria ci sono solo materie della facoltà di scienze e medicina...
Per ingnegneria c'è il S'Anna...ma è difficilissimo entrarci... Non bisogna ramanere indetro e bisogna mantenere la media di almeno 27 potendo accettare solamente una votazione sotto al 24...
I voti da noi non sono come in molte facoltà italiane (vedi legge o quelle umanistiche) dove in pratica non esistono voti sotto il 26. Da noi ti danno anche 18 e 19 :) E molte volte non ti puoi permettere di rifiutarli ;)
Vedi l'handle come un puntatore ad una risorsa del sistema operativo (in realtà non è un puntatore, ma un indice all'interno della tabella globale degli handle)... Ogni cosa in Windows ha un handle...un tasto...una finestra...un immagine...un file aperto...
Se per esempio conosco il nome dell'api che mi esegue una certa funzione e voglio implementarla in un mio programma cosa devo fare ?
Prima di tutto vai su MSDN e guardi come funziona...msdn.microsoft.com
#includi <windows.h> e altri header che servono per quella API...aggiungi alle opzioni di linking eventualmente i .lib necessari per quella API...
E sei a posto...
Volendo fare un esempio : ho trovato su MSDN questa API :
GetDevicePowerState
GetDevicePowerState
The GetDevicePowerState function retrieves the current power state of the specified device.
BOOL GetDevicePowerState(
HANDLE hDevice,
BOOL* pfOn
);
Parameters
hDevice
[in] Handle to an object on the device, such as a file or socket, or a handle to the device itself.
pfOn
[out] Pointer to the variable that receives the power state. This value is TRUE if the device is in the working state. Otherwise, it is FALSE.
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero.
Remarks
Come la si utilizza ? Se non sbaglio dovrebbe permettere di conoscere lo stato di un dispositovo . E poi volevo chiederti , non c'è una spiegazione italiana alle API ? Anche se non di tutte ma delle più importanti .
Prende un handle proveniente da una CreateFile o OpenFile e loro derivate...
I valori in out sono buffer in cui si ricevono i dati di risposta quindi li dichiari prima e li passi per indirizzo...
BOOL stato;
GetPowerState(h, &stato);
Comunque non l'ho mai utilizzata questa API...
Comunque puoi cercare a giro sorgenti di esempio...
Che io sappia non c'è una guida in italiano...poi se vuoi fare ingegneria devi abituarti a leggere l'inglese...alcuni libri di testo ci sono solamente in inglese (almeno da noi)...
Quindi quelli che vengono elencati sono i parametri giusto ? Ma quella h che tu hai passato dove l'hai dichiarata ? Ho capito che è un handle ma dove la si dichiara ?
Usando appunto la OpenFile o la CreateFile o loro derivate...
Scusa ma cosa sono OpenFile e CreateFile ?
E quindi volendo dichiarare l'handle con openfile o CreteFile come devo fare ?
Per vedere come opera quella API è sempre meglio cercarsi un esempio (va bene una ricerca aperta su internet)...
Spiegare come funziona la CreateFile è un po' complesso (vai a vedere MSDN per maggiori dettagli) perchè serve per aprire praticamente qualsiasi dispositivo...da un file ad una porta seriale...
Comunque un esempio è questo :
HANDLE hFile;
hFile = CreateFile("MYFILE.TXT", // open MYFILE.TXT
GENERIC_READ, // open for reading
FILE_SHARE_READ, // share for reading
NULL, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open file."); // process error
}
Ah, la OpenFile è deprecata...quidni meglio non usarla...
Quindi io con la createfile mi creo l'handle giusto ? Se non sbaglio l'handle era presente anche nella procedura di stampa che mi hai postato . E in quel caso che ci azzecca col file ? Voglio dire : mi hai detto di considerare l'handle come un puntatore anche se in realtà non lo è . Ma allora perché creare un file come nell'esempio ?
Ma nella procedura di stampa che mi hai postato non c'era nessun riferimento a CreateFile . Come mai ?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.