Newsgroup: it.comp.lang.c++
Titolo: BCB: Arresto sistema (shot-down)

Salve NG.
Vorrei sfruttare l'opzione di auto-accensione del BIOS ATX.
Fin qui nulla di problematico, il PC si accende all'orario programmato
e/o allo squillo di chiamata ma... come faccio a fargli fare anche
l'auto-spegnimento ???
Avrei pensato di realizzare con il C++Builder un timer o un prog.
(che spenga immediatamente il PC) da far eseguire alle Operazioni
pianificate.
Il problema e' che mi manca la routine C di sistema, che chiama:
Chiudi Sessione... / Arresta il sistema.
Sarebbe interessante anche un timer count-down con pausa
se e' presente ancora la portante (CD) a fine conteggio (0).
Timer da inserire in Esecuzione automatica.
Grazie.
...Togliere NO dall'indirizzo e-mail
                   La Pagina di Bruno
 
http://www.floating.com/~flo00137
      Progetti elettronici & sorgenti C++Builder
| PC | Amy | Sinclair & Z80 | uC | Sat | Ray-Tracing |
 
voy...@zuzzurello.com

...

Prova questo esempio:
#include <windows.h>
// # -> Forza uscita
// ! -> uscita normale
// @ -> riavvia sistema
// * -> riavvia come altro utente
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmd,int)
{
  unsigned flag = EWX_LOGOFF;
  switch(*cmd) {
    case '#':
      flag |= EWX_FORCE;
    case '!':
      flag |= EWX_SHUTDOWN | EWX_POWEROFF;
      break;
    case '@':
      flag |= EWX_SHUTDOWN;
      flag |= EWX_REBOOT;
    case '*':
      break;
    default:
      return 0;
    }
  ExitWindowsEx(flag,0);
  return 0;
}
Ciao
Nazzareno
Togliere l'underscore dall'email


Per eseguire lo spegnimento della macchina puoi utilizzare ExitWindowsEx
specificando il flag EWX_POWEROFF.
Tieni presente che lo spegnimento non č garantito se ci sono applicazioni
bloccate o, piů semplicemente, programmi che chiedono la conferma prima di
terminare; per evitare questo problema puoi utilizzare il flag EWX_FORCE.
Quanto alla gestione del timer, puoi utilizzare le TAPI per controllare lo stato
di connessione del modem ed evitare del tutto le gestioni temporizzate.
---
Valter Minute
min...@fortech.it
 (the reply address of this message is invalid)
---
Are you looking for a good freeware ScreenSaver? Try FOYD!
http://hotfiles.zdnet.com/cgi-bin/texis/swlib/hotfiles/getit.bin?fcode=000PZ0
if you want, I can send you the (free) C++ source code.

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmd,int)
Funge perfettamente. Grazie.
Ora non mi rimane che aggiungere il timer e il monitoraggio del CD
Per il timer... nessun problema ma, non so' come monitorizzare la
portante del modem (CD) :-((





Ti mando quest'altro esempio.
Sotto Win95 funziona se compilato in modalita' win32 (Gui o Console).
Se usi il BCB probabilmente hai il Tasm32 e potresti ridefinire le funzioni
di I/O su porte, comunque funziona anche cosi'.
Per gli indirizzi delle porte ho usato quelli di default.
//////////////////// CD_MODEM.CPP ///////////////////////////////
#ifdef __FLAT__
  #include <windows.h>
#else
  #error Usare modalita' Win32 Console
#endif
#include <stdio.h>
#include <conio.h>
#define PORT    Com_Base
// ................
// Modem Status Register
#define MSR     (PORT + 6)
// Modem Status Register
// ..................
#define DCD   0x80
////////////////////////////////////////////////////////////////////
typedef unsigned uint;
typedef unsigned short uint16;
typedef unsigned char uchar;
enum ePort {  COM1, COM2, COM3, COM4 };
#define _CLI __emit__(0xfa)
#define _STI __emit__(0xfb)
uchar myINP(uint16 port)
{
  _DX = port;
// in al,dx
  __emit__(0xEC);
  return _AL;
}
void myOUT(uint16 port,uchar val)
{
  _DX = port;
  _AL = val;
// out dx,al
  __emit__(0xEE);
}
uchar CheckCD(ePort com)
{
   uint Porte[]= { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
   uint Com_Base = Porte[com];
   _CLI;
   uchar al = myINP(MSR);
   _STI;
   return al;
}
#define ESC 27
int main(void)
{
  uchar old=0;
  uint count=0;
  for(;;) {
    if(kbhit())
      if((getch() & 0x7f) == ESC)
         break;
   uchar v = CheckCD(COM2);
   if(v != old) {
      printf("[%4d]Status Modem = 0x%X -> Ricevitore %s\n",
         ++count,uint(v),(v & DCD) ? "Sollevato" : "Abbassato");
      old = v;
      }
    }
  return EXIT_SUCCESS;
}

di connessione del modem ed evitare del tutto le gestioni temporizzate.
Un esempio ??? ...magari x BCB :-)
Il timer cmq, mi serve lo stesso :-)
Il prog. dovrebbe agire cosi':
1. Accensione del PC allo squillo telefonico
2. Spegnimento (shut-down) dopo 5-10min con le seguenti condizioni: 
  - Con CD non presente: attivazione di un timer di count-down
    di 10sec con tasto di annullamento.
  - Con CD presente: attesa fino alla sua scomparsa e poi
    attivazione di un timer di count-down di 10sec con tasto
    di annullamento.
Lo spegnimento dopo 5-10min potrebbe anche essere tolto ma,
il count-down di 10sec, no. Ogni tanto vorrei usare il PC
anche in modo 'normale'... vorrei avere il tempo per interrompere
l'auto-spegnimento.
Il programma dovrebbe rimanere nella barra di avvio 'accanto'
al mixer del volume ecc.. (chiedo scusa, non mi ricordo
il termine tecnico), per poi 'aprirsi' a centro schermo
visualizzando il count-down di 10sec ed un tasto per abbortire
manualmente lo shut-down del PC.
- Per la routine di shut-down, nessun problema (grazie a Paolini)
- Per il timer (di 5-10min e 10sec), nessun problema
- Per il monitoraggio del CD della seriale ...aiuto !!! :-)
- Per 'ridurre a icona' il prog. ...mai fatto, qualche esempio magari
  x BCB ???


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR cmd,int)
Funge perfettamente. Grazie.
Ora non mi rimane che aggiungere il timer e il monitoraggio del CD
Per il timer... nessun problema ma, non so' come monitorizzare la
portante del modem (CD) :-((
