#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);
}
Создание службы Builder C++
Люди, помогите умным советом! После долгих мучений написал вот такую небольшую программку (отслеживает изменения в указанной папке и копирует все в другую).
На форме с кнопкой все нормально работает, когда вставляю все это дело в службу, служба запускается но ничего не выполняет
Код:
Переменные читываются с файла 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
Через неделю уже сдавать нужно, а у меня не работает ничего :(