Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание службы Builder C++

52K
17 декабря 2009 года
v-i.king
6 / / 10.11.2009
Здравствуйте!
Люди, помогите умным советом! После долгих мучений написал вот такую небольшую программку (отслеживает изменения в указанной папке и копирует все в другую).
На форме с кнопкой все нормально работает, когда вставляю все это дело в службу, служба запускается но ничего не выполняет
Код:
#include <shellapi.h>
#include <inifiles.hpp>

...

void __fastcall TMyService::ServiceStart(TService *Sender, bool &Started)
{
 // считывание настроек
 TIniFile* ini;
 String user;
 String all_copy;
 String rename;
 String del;
 String folder_source1;
 String folder_out1;
 String name_user;
 //
 ini = new TIniFile("C:\options.ini");
 user = ini->ReadString("all_options","user",user);
 all_copy = ini->ReadString("all_options","all_copy",all_copy);
 rename = ini->ReadString("all_options","rename",rename);
 del = ini->ReadString("all_options","del",del);
 folder_source1 = ini->ReadString("folder_options","folder_source1",folder_source1);
 folder_out1 = ini->ReadString("folder_options","folder_out1",folder_out1);
 name_user = ini->ReadString("all_options","name_user",name_user);
 delete ini;
 //----
   unsigned long Size = MAX_COMPUTERNAME_LENGTH + 1;
 char *Buffer = new char[Size];
 GetUserName(Buffer, &Size);
 //--------------
 if (user == 1 && name_user == Buffer || user == 0)
 {
//----------------------------------

HANDLE hDir = CreateFile(folder_source1.c_str(),
              FILE_LIST_DIRECTORY,
              FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
              NULL,
              OPEN_EXISTING,
              FILE_FLAG_BACKUP_SEMANTICS,
              NULL);

BYTE outBuffer[5120];
VOID *pBuf = (BYTE*)&outBuffer;
FILE_NOTIFY_INFORMATION InfoNotify1;
DWORD InfoNotify;
BOOL ResultReadChange;
DWORD outSize = sizeof(outBuffer);

while(1)
//int i=1;
//if (i==1)
{ ResultReadChange = ReadDirectoryChangesW(hDir,
                     &outBuffer,
                     outSize,
                     TRUE,
                     FILE_NOTIFY_CHANGE_CREATION|
                     //FILE_NOTIFY_CHANGE_LAST_WRITE|
                     FILE_NOTIFY_CHANGE_SIZE|
                     FILE_NOTIFY_CHANGE_ATTRIBUTES|
                     FILE_NOTIFY_CHANGE_DIR_NAME|
                     FILE_NOTIFY_CHANGE_FILE_NAME,
                     &InfoNotify,
                     NULL,
                     NULL);
     if ( ResultReadChange )
      { FILE_NOTIFY_INFORMATION* pInfo = (FILE_NOTIFY_INFORMATION*) pBuf;
    //-------------------        изменение файла....
      if (//pInfo->Action == FILE_ACTION_ADDED ||
          pInfo->Action == FILE_ACTION_MODIFIED)

      {
        while(1)
        {char lpFileName[MAX_PATH];
        WideCharToMultiByte(CP_ACP,
                            0,
                            pInfo->FileName,
                            pInfo->FileNameLength/2,
                            lpFileName,
                            MAX_PATH,
                            0,
                            0);
        lpFileName[pInfo->FileNameLength/2] = 0;
        pInfo += pInfo->NextEntryOffset;
//------

if (all_copy == 0)
{
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
String sour = folder_source1 + "\\" + AnsiString(lpFileName) + '\0' + '\0';
String des = folder_out1 + "\\" + AnsiString(lpFileName) + '\0'+'\0';
op.hwnd = 0;
op.wFunc = FO_COPY;
op.pFrom = sour.c_str();
op.pTo = des.c_str();
op.fFlags = FOF_NOCONFIRMMKDIR | FOF_NOCONFIRMATION;
SHFileOperation(&op);
}
else
{
SHFILEOPSTRUCT sh;
ZeroMemory(&sh, sizeof(sh));
String sour = folder_source1 + "\\*.*" + '\0' + '\0';
String des = folder_out1 + "\\" + '\0'+'\0';
sh.hwnd = 0;
sh.wFunc = FO_COPY;
sh.pFrom = sour.c_str();
sh.pTo = des.c_str();
sh.fFlags = FOF_NOCONFIRMATION |FOF_SILENT;
SHFileOperation(&sh);
}
     if (!pInfo->NextEntryOffset) break;
     } // while close
     } // if (pInfo->Action close
//-------------------                удаление
      if (pInfo->Action == FILE_ACTION_REMOVED)
      {
        while(1)
        {char lpFileName[MAX_PATH];
        WideCharToMultiByte(CP_ACP,
                            0,
                            pInfo->FileName,
                            pInfo->FileNameLength/2,
                            lpFileName,
                            MAX_PATH,
                            0,
                            0);
        lpFileName[pInfo->FileNameLength/2] = 0;
        pInfo += pInfo->NextEntryOffset;
//------

if (del == 1)
{
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
String des = folder_out1 + "\\" + AnsiString(lpFileName) + '\0'+'\0';
op.hwnd = 0;
op.wFunc = FO_DELETE;
op.pFrom = des.c_str();
op.pTo = NULL;
op.fFlags = FOF_NOCONFIRMATION |FOF_SILENT;
SHFileOperation(&op);
}
     if (!pInfo->NextEntryOffset) break;
     } // while close
     } // if (pInfo->Action close
     //-------------------
   } // if ( ResultReadChange ) close
} // if (i==1) close
 }
//-----
Started = true;
}
//---------------------------------------------------------------------------
void __fastcall TMyService::ServiceStop(TService *Sender, bool &Stopped)
{
Stopped = true;        
}
//---------------------------------------------------------------------------
void __fastcall TMyService::ServiceExecute(TService *Sender)
{
while (!Terminated)
            ServiceThread->ProcessRequests(false);
}


Переменные читываются с файла C:\options.ini вот содержание:

[all_options]
user=1
name_user=Администратор
all_copy=0
rename=1
del=1
[folder_options]
folder_source1=D:\TEMP
folder_out1=D:\TEMP2

Через неделю уже сдавать нужно, а у меня не работает ничего :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог