Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Резидентный будильник, Visual C++ 
:(
    Опции темы
Mikel47
Дата 23.9.2004, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.9.2004

Репутация: нет
Всего: нет



Как сделать программу резидентной?
И резидентная программа - значит ли это, что она должна быть свернута в трей?
Всем заранее спасибо
PM MAIL   Вверх
NiJazz
Дата 23.9.2004, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Mikel47
Пиши как службу.
Выложу пример. Написано мною, давно. Главную функцию назови как тебе удобно, но не забудь сделать изменения в списке аргументов CreateThread.
Код
//////////////////////////////////////////////////////////////////////////
#include <iostream.h>
#include <windows.h>
#include <string.h>
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define TOTAL_GROUPS    4

#define ARGS_IN_LIST    2

#define NUMBER_OF_SID    0
#define CURRENT_ACCESS_MASK   1

#define IS_ADMIN     0
#define IS_USER      1
#define IS_GUEST     2
#define IS_POWER_USER    3
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
// Глобальные переменные
SERVICE_STATUS   ServiceStatus;
SERVICE_STATUS_HANDLE ServiceStatusHandle;
HANDLE     hPipe;
PACL     pAcl = NULL;
HANDLE     hThread;
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
// Основная работа службы
DWORD WINAPI PlayWithFile(void *)
{
// Твоя функция
}
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
// Функция управления службой
VOID __stdcall CtrlHandler (DWORD Opcode)
{    
//////////////////////////////////////////////////////////////////////////
switch(Opcode)    
{        
case SERVICE_CONTROL_PAUSE:
  // Пауза
           ServiceStatus.dwCurrentState = SERVICE_PAUSED;
  break;
   case SERVICE_CONTROL_CONTINUE:
  // Play
           ServiceStatus.dwCurrentState = SERVICE_RUNNING;
  break;
  // Стоп
case SERVICE_CONTROL_STOP:
           ServiceStatus.dwWin32ExitCode = 0;
           ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
           ServiceStatus.dwCheckPoint    = 0;
           ServiceStatus.dwWaitHint      = 0;  
 
  //////////////////////////////////////////////////////////////////////////
  // Задаём SERVICE_STATUS
           if (!SetServiceStatus(
      ServiceStatusHandle,
      &ServiceStatus))            
  {
               cout << "Couldn't set service status: " << GetLastError() << endl;
           }  
  return;          

 case SERVICE_CONTROL_INTERROGATE:
         break;  
}      
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// Задаём SERVICE_STATUS
   if (!SetServiceStatus (ServiceStatusHandle,  &ServiceStatus))    
{
       cout << "Couldn't set service status: " << GetLastError() << endl;        
}    
//////////////////////////////////////////////////////////////////////////

return;
}
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
// Функция работы службы
void __stdcall ServiceWork(DWORD argc, LPTSTR *argv)
{
//////////////////////////////////////////////////////////////////////////
// Переменные
DWORD status;
DWORD specificError;
//////////////////////////////////////////////////////////////////////////

ServiceStatus.dwServiceType    = SERVICE_WIN32;
   ServiceStatus.dwCurrentState      = SERVICE_START_PENDING;
   ServiceStatus.dwControlsAccepted  = SERVICE_ACCEPT_STOP |
            SERVICE_ACCEPT_PAUSE_CONTINUE;
   ServiceStatus.dwWin32ExitCode   = 0;
   ServiceStatus.dwServiceSpecificExitCode = 0;
   ServiceStatus.dwCheckPoint    = 0;
   ServiceStatus.dwWaitHint    = 0;  

   //////////////////////////////////////////////////////////////////////////
   ServiceStatusHandle = RegisterServiceCtrlHandler(
          TEXT("Service1"),
          CtrlHandler);
// Если не смог
if (ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)    
{
       cout << "Couldn't register service's control handler: " << GetLastError() << endl;
 return;    
}  
//////////////////////////////////////////////////////////////////////////

   status = NO_ERROR;
   
if (status != NO_ERROR)    
{
       ServiceStatus.dwCurrentState       = SERVICE_STOPPED;
       ServiceStatus.dwCheckPoint         = 0;
       ServiceStatus.dwWaitHint           = 0;
       ServiceStatus.dwWin32ExitCode      = status;
       ServiceStatus.dwServiceSpecificExitCode = specificError;
 
       SetServiceStatus(
     ServiceStatusHandle,
     &ServiceStatus);        
 return;    
}    

   ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
   ServiceStatus.dwCheckPoint         = 0;
   ServiceStatus.dwWaitHint           = 0;  
   
//////////////////////////////////////////////////////////////////////////
// Попытка установить состояние работы
if (!SetServiceStatus(
    ServiceStatusHandle,
    &ServiceStatus))    
{
       cout << "Could'n set service's status: " << GetLastError() << endl;  
}  

   //////////////////////////////////////////////////////////////////////////
   // Начало работы службы
hThread = CreateThread(
     NULL,
     0,
     PlayWithFile,
     NULL,
     0,
     NULL);
//////////////////////////////////////////////////////////////////////////

return;
}
//////////////////////////////////////////////////////////////////////////


void main(int argc, char *argv[])
{
SERVICE_STATUS  ServStatus;
SC_HANDLE   hScm;
SC_HANDLE   hSrv;

SERVICE_TABLE_ENTRY   DispatchTable[] =    
{
       { TEXT("NiJazz's Service"), ServiceWork},
       { NULL,      NULL       }
};    



//////////////////////////////////////////////////////////////////////////
// Проверяем, что нужно сделать: включить или выключить службу
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// Если остановить
if (argc>1 && !stricmp(argv[1],"delete"))
{
 //////////////////////////////////////////////////////////////////////////
 // Попытка открыть SCM
 hScm = OpenSCManager(
      NULL,
      NULL,
      SC_MANAGER_CREATE_SERVICE);
 // Если не удалось
 if (!hScm)
 {
  cout << "Couldn't open SCM: " << GetLastError() << endl;
 }
 
 //////////////////////////////////////////////////////////////////////////
 // Открываем существующую службу
 hSrv = OpenService(
     hScm,
     "NiJazz's service",
     DELETE);
 // Если не смогли открыть для удаления
 if (!hSrv)
 {
  cout << "Couldn't open service: " << GetLastError() << endl;
 }

 /*if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
 {
  ServiceStatus.dwCurrentState = SERVICE_STOPPED;
  SetServiceStatus(
      ServiceStatusHandle,
      &ServiceStatus);
 }

 ControlService(
    hSrv,
    SERVICE_CONTROL_STOP,
    &ServiceStatus);*/

 if (!DeleteService(hSrv))
 {
  cout << "Couldn't delete service: " << GetLastError() << endl;
 }
 //////////////////////////////////////////////////////////////////////////
 CloseServiceHandle(hSrv);
 CloseServiceHandle(hScm);
 CloseHandle(hPipe);
 free(pAcl);
}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// Если запустить
if (argc>1 && !stricmp(argv[1],"setup"))
{
 char ModName[1024];
 ModName[0]='"';
 GetModuleFileName(NULL,ModName+1,1023);
 strcat(ModName,"\"");
 //////////////////////////////////////////////////////////////////////////
 // Попытка открыть SCM
 hScm = OpenSCManager(
      NULL,
      NULL,
      SC_MANAGER_CREATE_SERVICE);
 // Если не удалось
 if (!hScm)
 {
  cout << "Couldn't open SCM: " << GetLastError() << endl;
 }
 
 //////////////////////////////////////////////////////////////////////////
 // Создаём службу
 hSrv = CreateService(
      hScm,
      "NiJazz's service",
      "NiJazz's service",
      SC_MANAGER_ALL_ACCESS,
      SERVICE_WIN32_OWN_PROCESS,
      SERVICE_DEMAND_START,
      SERVICE_ERROR_NORMAL,
      ModName,
      NULL,
      NULL,
      NULL,
      NULL,
      NULL);
 if (!hSrv)
 {
  cout << "Couldn't register service: " << GetLastError() << endl;
 }

 StartService(
    hSrv,
    NULL,
    NULL);

 CloseServiceHandle(hScm);
 CloseServiceHandle(hSrv);
}
//////////////////////////////////////////////////////////////////////////

StartServiceCtrlDispatcher(DispatchTable);
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.