Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с shellexecute 
:(
    Опции темы
m1nder
Дата 31.10.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



Доброго времени! Подскажите, в чем проблемка. Не shellexecute отрабатывает некоррктно(ошибок нет, просто не происходит копирование, как будто параметры xcopy не передаются), вот код:

Код


program OMK_srvn1;

{$APPTYPE CONSOLE}

uses
  windows,
  winsvc,
  SysUtils,
  ShellApi;
const c_ServiceName = 'OMK_srvn1';
var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYW;
var sst : SERVICE_STATUS;
var sstHandle : SERVICE_STATUS_HANDLE;
var handle: hwnd;
///////////////////////////////////////////////////////////////////////
procedure SetServiceStatus1;
begin
  if not SetServiceStatus(sstHandle,sst) then
  RaiseLastOSError;
end;
///////////////////////////////////////////////////////////////////////
procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
begin
 case Opcode of

  SERVICE_CONTROL_STOP:
   begin
    sst.dwWin32ExitCode:=0;
    sst.dwCurrentState := SERVICE_STOPPED;
    sst.dwCheckPoint   :=0;
    sst.dwWaitHint     :=0;
    SetServiceStatus1;
    exit;
   end;

  SERVICE_CONTROL_INTERROGATE : ;
 end;

 SetServiceStatus1;
end;

///////////////////////////////////////////////////////////////////////
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var  F: TSearchRec;
     files,mls,path,source: string;
     Attr,intFileAge1,intFileAge2: Integer;

begin
  path:='d:\Level2\DA_report_cr_multi\REP_QUALITY\';   //ParamStr(1)
  source:='c:\REPORTS\'; // \\127.0.0.1\c$\

  files:='';
  Attr:= faAnyFile;
  intFileAge1:=0;
  intFileAge2:=0;

  sst.dwServiceType      := SERVICE_WIN32;
  sst.dwCurrentState     := SERVICE_START_PENDING;
  sst.dwControlsAccepted := SERVICE_ACCEPT_STOP;
//    or SERVICE_ACCEPT_PAUSE_CONTINUE;
  sst.dwWin32ExitCode           := 0;
  sst.dwServiceSpecificExitCode := 0;
  sst.dwCheckPoint              := 0;
  sst.dwWaitHint                := 0;

  sstHandle :=
           RegisterServiceCtrlHandler(c_ServiceName,@ServiceCtrlHandler);

  if sstHandle = 0 then RaiseLastOSError;

   sst.dwCurrentState :=SERVICE_RUNNING;
   sst.dwCheckPoint   :=0;
   sst.dwWaitHint     :=0;

   SetServiceStatus1;

  //ОСНОВНОЙ КОД ПРОГРАММЫ
  repeat
   sleep(10000);
ShellExecute(Handle, 'open',
  'xcopy', 'd:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf Q: /Q', nil,
  SW_HIDE);

  until sst.dwCurrentState = SERVICE_STOPPED;
end;

///////////////////////////////////////////////////////////////////////

var schService, schSCManager: SC_HANDLE;
var binExe: pchar;
begin

{ if ParamStr(1)='' then begin
   writeln('Enter parameter "/?" for help(example: OMK_srvn.exe /?)');
   exit;
 end;

 if ParamStr(1)='/?' then begin
   writeln('This program(service) move DAS files.');
   writeln('Enter parameters for starting: /i-install service | /d-delete service');
   exit;
 end;

 if (ParamStr(1)<>'/i') and (ParamStr(1)<>'/d') then begin
   writeln('Enter parameters for starting: /i-install service | /d-delete service');
   exit;
   end;

 }
 if ParamStr(1)='/i' then begin
   binExe:=pchar(ParamStr(0));
 ///////////////////////////// Установка службы

    schSCManager := OpenSCManager(
    nil,                    // local machine
    nil,                    // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

    if schSCManager=0 then RaiseLastOSError;

    schService := CreateService(
        schSCManager,              // SCManager database
        c_ServiceName,               // name of service
        c_ServiceName,           // service name to display
        SERVICE_ALL_ACCESS,        // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_DEMAND_START,      // start type
        SERVICE_ERROR_NORMAL,      // error control type
        binExe,        // service's binary
        nil,                      // no load ordering group
        nil,                      // no tag identifier
        nil,                      // no dependencies
        nil,                      // LocalSystem account
        nil);                     // no password

     if schService=0 then
       RaiseLastOSError;

     if not CloseServiceHandle(schService) then
       RaiseLastOSError;

       exit;

 ///////////////////////////// Удаление службы

   end else if ParamStr(1)='/d' then begin

    schSCManager := OpenSCManager(
    nil,                    // local machine
    nil,                    // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

    if schSCManager=0 then RaiseLastOSError;

     schService := OpenService(
        schSCManager,       // SCManager database
        c_ServiceName,       // name of service
        SERVICE_ALL_ACCESS);            // only need DELETE access

    if schService = 0 then
      RaiseLastOSError;

    if not DeleteService(schService) then
      RaiseLastOSError;

    if not CloseServiceHandle(schService) then
      RaiseLastOSError;
    exit;
 end;
 ///////////////////////////// Запуск службы
 DispatchTable[0].lpServiceName:=c_ServiceName;
 DispatchTable[0].lpServiceProc:=@ServiceProc;

 DispatchTable[1].lpServiceName:=nil;
 DispatchTable[1].lpServiceProc:=nil;

 if not StartServiceCtrlDispatcher(DispatchTable[0]) then
   RaiseLastOSError;

end.


PM MAIL WWW ICQ   Вверх
Данкинг
Дата 31.10.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Что такое "CoilManager_QUALITY_REP_*.pdf" ? smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
m1nder
Дата 31.10.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



ShellExecute из программы отрабатывает корректно, а из службы не хочет нормально работать!!! 
PM MAIL WWW ICQ   Вверх
Keeper89
Дата 31.10.2009, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Используйте CreateProcess вместо ShellExecute.

Цитата

The executable is started within the environment of the service, thus in the (invisible) desktop of your service. In order to start the application in an interactive desktop you have two options:


    * Allow interaction with the desktop from your service
    * Use 'CreateProcess()' instead and set the 'lpDesktop' member of the 'STARTUPINFO' structure accordingly (go with 'winsta0\default' for the default one).

Линк


--------------------
PM MAIL WWW   Вверх
m1nder
Дата 2.11.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



Благодар, за ответ! Вы мне очень помогли! Буду переделывать.
PM MAIL WWW ICQ   Вверх
m1nder
Дата 4.11.2009, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



Переделал, но проблема не исчезла, возможно служба перекрывает кислород моей процедуре! Вот код:

Код


program OMK_srvn1;

{$APPTYPE CONSOLE}

uses
  windows,
  winsvc,
  SysUtils,
  ShellApi;
const c_ServiceName = 'OMK_srvn1';
var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYW;
var sst : SERVICE_STATUS;
var sstHandle : SERVICE_STATUS_HANDLE;
var handle: hwnd;
var   si: STARTUPINFO;
      pi: PROCESS_INFORMATION;
      cmdline: string;
///////////////////////////////////////////////////////////////////////
procedure SetServiceStatus1;
begin
  if not SetServiceStatus(sstHandle,sst) then
  RaiseLastOSError;
end;
///////////////////////////////////////////////////////////////////////
procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
begin
 case Opcode of

  SERVICE_CONTROL_STOP:
   begin
    sst.dwWin32ExitCode:=0;
    sst.dwCurrentState := SERVICE_STOPPED;
    sst.dwCheckPoint   :=0;
    sst.dwWaitHint     :=0;
    SetServiceStatus1;
    exit;
   end;

  SERVICE_CONTROL_INTERROGATE : ;
 end;

 SetServiceStatus1;
end;

///////////////////////////////////////////////////////////////////////

procedure copy;
//var   si: STARTUPINFO;
//      pi: PROCESS_INFORMATION;
//      cmdline: string;
begin
  sleep(10000);
  ZeroMemory(@si,sizeof(si));
  si.cb:=SizeOf(si);
  cmdline:='xcopy d:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf Q: /Q';
   if not CreateProcess( nil, { No module name (use command line). }
  PChar(cmdline),            { Command line. }
  nil,                       { Process handle not inheritable. }
  nil,                       { Thread handle not inheritable. }
  False,                     { Set handle inheritance to FALSE. }
  0,                         { No creation flags. }
  nil,                       { Use parent's environment block. }
  nil,                       { Use parent's starting directory. }
  si,                        { Pointer to STARTUPINFO structure. }
  pi )                       { Pointer to PROCESS_INFORMATION structure. }
  then
  Exit;
  WaitForSingleObject( pi.hProcess, INFINITE );
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );
end;

///////////////////////////////////////////////////////////////////////
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var  F: TSearchRec;
     files,mls,path,source: string;
     Attr,intFileAge1,intFileAge2: Integer;
     si: STARTUPINFO;
     pi: PROCESS_INFORMATION;
     cmdline: string;

begin
  path:='d:\Level2\DA_report_cr_multi\REP_QUALITY\';   //ParamStr(1)
  source:='c:\REPORTS\'; // \\127.0.0.1\c$\
  files:='';
  Attr:= faAnyFile;
  intFileAge1:=0;
  intFileAge2:=0;

  sst.dwServiceType      := SERVICE_WIN32;
  sst.dwCurrentState     := SERVICE_START_PENDING;
  sst.dwControlsAccepted := SERVICE_ACCEPT_STOP;
//    or SERVICE_ACCEPT_PAUSE_CONTINUE;
  sst.dwWin32ExitCode           := 0;
  sst.dwServiceSpecificExitCode := 0;
  sst.dwCheckPoint              := 0;
  sst.dwWaitHint                := 0;

  sstHandle :=
           RegisterServiceCtrlHandler(c_ServiceName,@ServiceCtrlHandler);

  if sstHandle = 0 then RaiseLastOSError;

   sst.dwCurrentState :=SERVICE_RUNNING;
   sst.dwCheckPoint   :=0;
   sst.dwWaitHint     :=0;

   SetServiceStatus1;

  //ОСНОВНОЙ КОД ПРОГРАММЫ
  repeat

//ShellExecute(Handle, 'open',
//  'xcopy', 'd:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf Q: /Q', nil,
//  SW_HIDE);
  copy;
  until sst.dwCurrentState = SERVICE_STOPPED;
end;

///////////////////////////////////////////////////////////////////////

var schService, schSCManager: SC_HANDLE;
var binExe: pchar;
begin

{ if ParamStr(1)='' then begin
   writeln('Enter parameter "/?" for help(example: OMK_srvn.exe /?)');
   exit;
 end;

 if ParamStr(1)='/?' then begin
   writeln('This program(service) move DAS files.');
   writeln('Enter parameters for starting: /i-install service | /d-delete service');
   exit;
 end;

 if (ParamStr(1)<>'/i') and (ParamStr(1)<>'/d') then begin
   writeln('Enter parameters for starting: /i-install service | /d-delete service');
   exit;
   end;

 }
 if ParamStr(1)='/i' then begin
   binExe:=pchar(ParamStr(0));
 ///////////////////////////// Установка службы

    schSCManager := OpenSCManager(
    nil,                    // local machine
    nil,                    // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

    if schSCManager=0 then RaiseLastOSError;

    schService := CreateService(
        schSCManager,              // SCManager database
        c_ServiceName,               // name of service
        c_ServiceName,           // service name to display
        SERVICE_ALL_ACCESS,        // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_DEMAND_START,      // start type
        SERVICE_ERROR_NORMAL,      // error control type
        binExe,        // service's binary
        nil,                      // no load ordering group
        nil,                      // no tag identifier
        nil,                      // no dependencies
        nil,                      // LocalSystem account
        nil);                     // no password

     if schService=0 then
       RaiseLastOSError;

     if not CloseServiceHandle(schService) then
       RaiseLastOSError;

       exit;

 ///////////////////////////// Удаление службы

   end else if ParamStr(1)='/d' then begin

    schSCManager := OpenSCManager(
    nil,                    // local machine
    nil,                    // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

    if schSCManager=0 then RaiseLastOSError;

     schService := OpenService(
        schSCManager,       // SCManager database
        c_ServiceName,       // name of service
        SERVICE_ALL_ACCESS);            // only need DELETE access

    if schService = 0 then
      RaiseLastOSError;

    if not DeleteService(schService) then
      RaiseLastOSError;

    if not CloseServiceHandle(schService) then
      RaiseLastOSError;
    exit;
 end;
 ///////////////////////////// Запуск службы
 DispatchTable[0].lpServiceName:=c_ServiceName;
 DispatchTable[0].lpServiceProc:=@ServiceProc;

 DispatchTable[1].lpServiceName:=nil;
 DispatchTable[1].lpServiceProc:=nil;

 if not StartServiceCtrlDispatcher(DispatchTable[0]) then
   RaiseLastOSError;

end.


PM MAIL WWW ICQ   Вверх
MetalFan
Дата 4.11.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



хм, возможно службе прав не хватает, чтобы шариться по сети...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
m1nder
Дата 5.11.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



Нет, я даже notepad запускал с параметрами,  тоже ничего. Но это может объяснить: нужно lpDesktop поставить. Процесс я отслеживал - он запускается, но ничего не делает!!!
PM MAIL WWW ICQ   Вверх
kami
Дата 5.11.2009, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(m1nder @  5.11.2009,  00:24 Найти цитируемый пост)
 я даже notepad запускал с параметрами,  тоже ничего. 

Ну, то что "ничего" - это ничего не значит. Либо ошибка, либо блокнот запустился, но на десктопе сервисов (т.е. процесс notepad есть, но не виден).
Продолжим тем, что CreateProcess - это конечно, хорошо, но для его использования служба должна быть интерактивной, т.е. при ее создании нужно указывать 
Код

SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS
, что само по себе уже моветон, ибо не работает в Висте а так же с быстрым переключением пользователей.
Посему лучшим вариантом для создания из сервиса процесса на активном десктопе будет комбинация сервис+десктопное приложение, которые будут общаться между собой любым из методов IPC (сообщения отметаются сразу - SendMessage и иже с ними не работают между разными десктопами, оконными станциями и сессиями).
Если же такой возможности нет, то может спасти CreateProcessAsUser (код сейчас поищу у себя в закромах).
PM MAIL WWW   Вверх
kami
Дата 5.11.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(kami @  5.11.2009,  00:45 Найти цитируемый пост)
 для его использования служба должна быть интерактивной,

несколько неправильно написал - служба должна быть интерактивной, если запускаемый процесс должен взаимодействовать с пользователем.
При запуске через CreateProcessAsUser интерактивность необязательна. Afair.

Нашел файл (вернее, несколько), писал давно, так что... не пинать за неразборчивый почерк и лишние телодвижения smile

Это сообщение отредактировал(а) kami - 5.11.2009, 01:06

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ExecuteOnSession.zip 8,48 Kb
PM MAIL WWW   Вверх
m1nder
Дата 5.11.2009, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



Вот при таком коде xcopy видна в процессах на секунду, зетем опять вылетает(естественно своих функций  не выполняет):
Код


program OMK_srvn1;

{$APPTYPE CONSOLE}

uses
  windows,
  winsvc,
  SysUtils,
  ShellApi;
const c_ServiceName = 'OMK_srvn1';
var DispatchTable : array [0..1] of _SERVICE_TABLE_ENTRYW;
var sst : SERVICE_STATUS;
var sstHandle : SERVICE_STATUS_HANDLE;
var handle: THandle;
var   si: STARTUPINFO;
      pi: PROCESS_INFORMATION;
      cmdline: string;
///////////////////////////////////////////////////////////////////////
procedure SetServiceStatus1;
begin
  if not SetServiceStatus(sstHandle,sst) then
  RaiseLastOSError;
end;
///////////////////////////////////////////////////////////////////////
procedure ServiceCtrlHandler(Opcode : Cardinal);stdcall;
begin
 case Opcode of

  SERVICE_CONTROL_STOP:
   begin
    sst.dwWin32ExitCode:=0;
    sst.dwCurrentState := SERVICE_STOPPED;
    sst.dwCheckPoint   :=0;
    sst.dwWaitHint     :=0;
    SetServiceStatus1;
    exit;
   end;

  SERVICE_CONTROL_INTERROGATE : ;
 end;

 SetServiceStatus1;
end;

///////////////////////////////////////////////////////////////////////

procedure copy;
//var   si: STARTUPINFO;
//      pi: PROCESS_INFORMATION;
//      cmdline: string;
begin

  sleep(10000);
//  ZeroMemory(@si,sizeof(si));
//  si.cb:=SizeOf(si);
//  cmdline:='d:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf q: /Q';
//   if not CreateProcess( PChar('C:\WINDOWS\system32\xcopy.exe'), { No module name (use command line). }
//  PChar(cmdline),            { Command line. }
//  nil,                       { Process handle not inheritable. }
//  nil,                       { Thread handle not inheritable. }
//  False,                     { Set handle inheritance to FALSE. }
//  0,                         { No creation flags. }
//  nil,                       { Use parent's environment block. }
//  nil,                       { Use parent's starting directory. }
//  si,                        { Pointer to STARTUPINFO structure. }
//  pi )                       { Pointer to PROCESS_INFORMATION structure. }
//  then
// Exit;
// WaitForSingleObject( pi.hProcess, INFINITE );
//  CloseHandle( pi.hProcess );
//  CloseHandle( pi.hThread );

try
    FillChar(SI, SizeOf(SI), 0);
    SI.cb := SizeOf(SI);
    SI.dwFlags := STARTF_FORCEONFEEDBACK or STARTF_USESHOWWINDOW;
//    SI.wShowWindow := Flag;
    if CreateProcessAsUser(Handle, PChar('C:\WINDOWS\system32\xcopy.exe'), PChar('d:\Level2\DA_report_cr_multi\REP_QUALITY\CoilManager_QUALITY_REP_*.pdf q: /Q'), nil, nil, false,
      CREATE_NEW_CONSOLE, nil, nil, SI, PI) then
      begin
        CloseHandle(PI.hThread);
      end;
  finally
    CloseHandle(Handle);

end;

end;

///////////////////////////////////////////////////////////////////////
procedure ServiceProc(argc : DWORD;var argv : array of PChar);stdcall;
var  F: TSearchRec;
     files,mls,path,source: string;
     Attr,intFileAge1,intFileAge2: Integer;
     si: STARTUPINFO;
     pi: PROCESS_INFORMATION;
     cmdline: string;

begin
  path:='d:\Level2\DA_report_cr_multi\REP_QUALITY\';   //ParamStr(1)
  source:='c:\REPORTS\'; // \\127.0.0.1\c$\
  files:='';
  Attr:= faAnyFile;
  intFileAge1:=0;
  intFileAge2:=0;

  sst.dwServiceType      := SERVICE_WIN32;
  sst.dwCurrentState     := SERVICE_START_PENDING;
  sst.dwControlsAccepted := SERVICE_ACCEPT_STOP;
//    or SERVICE_ACCEPT_PAUSE_CONTINUE;
  sst.dwWin32ExitCode           := 0;
  sst.dwServiceSpecificExitCode := 0;
  sst.dwCheckPoint              := 0;
  sst.dwWaitHint                := 0;

  sstHandle :=
           RegisterServiceCtrlHandler(c_ServiceName,@ServiceCtrlHandler);

  if sstHandle = 0 then RaiseLastOSError;

   sst.dwCurrentState :=SERVICE_RUNNING;
   sst.dwCheckPoint   :=0;
   sst.dwWaitHint     :=0;

   SetServiceStatus1;

  //ОСНОВНОЙ КОД ПРОГРАММЫ
  repeat

  copy;
  until sst.dwCurrentState = SERVICE_STOPPED;
end;

///////////////////////////////////////////////////////////////////////

var schService, schSCManager: SC_HANDLE;
var binExe: pchar;
begin

{ if ParamStr(1)='' then begin
   writeln('Enter parameter "/?" for help(example: OMK_srvn.exe /?)');
   exit;
 end;

 if ParamStr(1)='/?' then begin
   writeln('This program(service) move DAS files.');
   writeln('Enter parameters for starting: /i-install service | /d-delete service');
   exit;
 end;

 if (ParamStr(1)<>'/i') and (ParamStr(1)<>'/d') then begin
   writeln('Enter parameters for starting: /i-install service | /d-delete service');
   exit;
   end;

 }
 if ParamStr(1)='/i' then begin
   binExe:=pchar(ParamStr(0));
 ///////////////////////////// Установка службы

    schSCManager := OpenSCManager(
    nil,                    // local machine
    nil,                    // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

    if schSCManager=0 then RaiseLastOSError;

    schService := CreateService(
        schSCManager,              // SCManager database
        c_ServiceName,               // name of service
        c_ServiceName,           // service name to display
        SERVICE_ALL_ACCESS,        // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_DEMAND_START,      // start type
        SERVICE_ERROR_NORMAL,      // error control type
        binExe,        // service's binary
        nil,                      // no load ordering group
        nil,                      // no tag identifier
        nil,                      // no dependencies
        nil,                      // LocalSystem account
        nil);                     // no password

     if schService=0 then
       RaiseLastOSError;

     if not CloseServiceHandle(schService) then
       RaiseLastOSError;

       exit;

 ///////////////////////////// Удаление службы

   end else if ParamStr(1)='/d' then begin

    schSCManager := OpenSCManager(
    nil,                    // local machine
    nil,                    // ServicesActive database
    SC_MANAGER_ALL_ACCESS);  // full access rights

    if schSCManager=0 then RaiseLastOSError;

     schService := OpenService(
        schSCManager,       // SCManager database
        c_ServiceName,       // name of service
        SERVICE_ALL_ACCESS);            // only need DELETE access

    if schService = 0 then
      RaiseLastOSError;

    if not DeleteService(schService) then
      RaiseLastOSError;

    if not CloseServiceHandle(schService) then
      RaiseLastOSError;
    exit;
 end;
 ///////////////////////////// Запуск службы
 DispatchTable[0].lpServiceName:=c_ServiceName;
 DispatchTable[0].lpServiceProc:=@ServiceProc;

 DispatchTable[1].lpServiceName:=nil;
 DispatchTable[1].lpServiceProc:=nil;

 if not StartServiceCtrlDispatcher(DispatchTable[0]) then
   RaiseLastOSError;

end.


PM MAIL WWW ICQ   Вверх
Akella
Дата 5.11.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



А ты пробовал запускать xcopy непосредственно из системы с твоими параметрами?
PM MAIL   Вверх
CodeMonkey
Дата 5.11.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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



Откуда куда копируем-то? Диск случайно не сетевой? Если да, то откуда же ему взяться в контексте службы?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
m1nder
Дата 5.11.2009, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 23.9.2009
Где: Нижний Новгород

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



Цитата

А ты пробовал запускать xcopy непосредственно из системы с твоими параметрами? 

Да, конечно я пробовал. Все работает!
Цитата

Откуда куда копируем-то? Диск случайно не сетевой? Если да, то откуда же ему взяться в контексте службы? 

Так как мне его туда воткнуть?
PM MAIL WWW ICQ   Вверх
Keeper89
Дата 5.11.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Цитата(m1nder @  5.11.2009,  20:49 Найти цитируемый пост)
Так как мне его туда воткнуть? 

Можно через net use:
Код

net use X: \YourServer\SharedDrive YourPassword /User:UserName
xcopy ...
net use X: /delete



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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