Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2008, 18:34   #21
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Так, с этим вроде разобрался...
Теперь другая проблема: поставил компонент инди на службу, хочу отсылать данные через смтп. Взял рабочий кусок кода с другого проекта (с простого приложения на форме), и пишет ошибку:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, IdMessage, Registry,Variants,Forms,
  StdCtrls,IdTCPServer, IdSMTPServer;

type
  TService1 = class(TService)
    IdMessage1: TIdMessage;
    IdSMTP1: TIdSMTP;
    procedure sendlatter;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;
   stop: boolean;
   tm: tsystemtime;
implementation

{$R *.DFM}

procedure sendlatter;
var
  M: TIdMessage;
  REG: TRegistry;
begin
REG := TRegistry.Create;
REG.RootKey:=HKEY_LOCAL_MACHINE;
REG.OpenKey('SOFTWARE\MCNT\Traffic Pro',false);
  M := TIdMessage.Create(service1);
//  TIdAttachment.Create(M.MessageParts , 'f:\smtp\1.txt');
  M.From.Text :=REG.ReadString('smtpmail');  //отправитель
  M.Recipients.Add;
  M.Recipients.Items[0].Text :='dn1983@bigmir.net'; //Получатель
  M.Subject := 'transfer'; //Тема письма


if REG.ReadString('auth')='1' then
          begin
          IdSMTP1.AuthenticationType := atLogin;
          IdSMTP1.Username := REG.ReadString('login');
          IdSMTP1.Password := REG.ReadString('pass');
          end
             else IdSMTP1.AuthenticationType := atNone;
  IdSMTP1.Host := REG.ReadString('smtpserver');
  idSMTP1.Port:= strtoint(REG.ReadString('smtpport'));
  try
  IdSMTP1.Connect();
  except;
  end;
  if IdSMTP1.Connected then
  begin
  showmessage('Соединение установлено');
  try
    IdSMTP1.Send(M);
   except
     ShowMessage('Сообщение отправить не удалось');
    end;
 IdSMTP1.Disconnect;
  end  else  showmessage('Соединение не установлено');
REG.CloseKey;
REG.Destroy;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceCreate(Sender: TObject);
begin
stop:=false;
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
while stop<>true do
   begin
   sleep(20000);
   getsystemtime(tm);
   if tm.wMinute mod 5 =0 then
      begin
      showmessage('будем пробывать отсылать почту');
      sendlatter;
      end;
   end;
end;

end.
И в этом коде делфи не понимает idSMTP1, пишет ошибку, что необьявленный идентификатор, может что то в обьявлении не так сделал?
dimonbest вне форума Ответить с цитированием
Старый 20.02.2008, 12:51   #22
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

С этим разобрался, остались последние 2 вопроса:
1. Можно ли сделать (и если можно то как), чтоб при инсталяции службы (запуска с параметром инсталл) не выводило сообщение о том что служба успешно установлена?
2. Можно ли в программе (не в службе, например командой winexec) управлять службой: останавливать, запускать, и делать паузу...
dimonbest вне форума Ответить с цитированием
Старый 20.02.2008, 13:16   #23
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от dimonbest Посмотреть сообщение
С этим разобрался, остались последние 2 вопроса:
1. Можно ли сделать (и если можно то как), чтоб при инсталяции службы (запуска с параметром инсталл) не выводило сообщение о том что служба успешно установлена?
Можно. С ключами "/INSTALL /SILENT".

Цитата:
Сообщение от dimonbest Посмотреть сообщение
2. Можно ли в программе (не в службе, например командой winexec) управлять службой: останавливать, запускать, и делать паузу...
Для этих вещей существует функция ControlService. И фантазия разработчика, которая может использовать объекты синхронизации, общую память, сетевые протоколы и т.д., в общем всё, что можно использовать для обмена данными между двумя разными процессами.
B_N вне форума Ответить с цитированием
Старый 20.02.2008, 14:56   #24
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Для этих вещей существует функция ControlService. И фантазия разработчика, которая может использовать объекты синхронизации, общую память, сетевые протоколы и т.д., в общем всё, что можно использовать для обмена данными между двумя разными процессами.
По первому пункту все получилось, СПАСИБА!
А вот по второму - это для меня темный лес. Может у кого то примерчик есть? При инсталяции службы она сама себя запустить может, чтоб не делать перезагрузку компьютеру и не запускать вручную?
dimonbest вне форума Ответить с цитированием
Старый 20.02.2008, 15:18   #25
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

dimonbest, прочитайте сначала про ControlService
http://msdn2.microsoft.com/en-us/library/ms682108.aspx
http://rsdn.ru/article/baseserv/svcadmin-2.xml
B_N вне форума Ответить с цитированием
Старый 20.02.2008, 15:58   #26
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

С этим всем ознакомлюсь...
не знаете почему
Код:
procedure TService1.ServiceAfterInstall(Sender: TService);
begin
service1.DoStart;
end;
Не запускает сервис после инсталяции?
Команда service1.DoStop; работает...
dimonbest вне форума Ответить с цитированием
Старый 27.02.2008, 16:01   #27
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Подскажите пожалуйста такой вопрос:
Написал службу, которая раз в 5 минут отправляет данные на ящик(почту).
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, IdMessage, Registry,Variants,Forms,
  StdCtrls,IdTCPServer, IdSMTPServer;

type
  TService1 = class(TService)
    IdMessage1: TIdMessage;
    IdSMTP1: TIdSMTP;
    procedure sendlatter;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;
   stop,fl: boolean;
   tm: tsystemtime;
implementation

{$R *.DFM}

procedure TService1.sendlatter;
label scip;
var
  M: TIdMessage;
  REG: TRegistry;
  i:byte;
begin
REG := TRegistry.Create;
REG.RootKey:=HKEY_LOCAL_MACHINE;
REG.OpenKey('SOFTWARE\MCNT\Traffic Pro',false);
if REG.ValueExists('smtpexec') then
  begin
  if REG.ReadString('smtpexec')='0' then goto scip;
  if REG.ReadString('smtpexec')='5' then
      begin
      service1.DoStop;
      stop:=true;
      end;
  end;
  M := TIdMessage.Create(service1);
  M.From.Text :=REG.ReadString('smtpmail');  //отправитель
  M.Recipients.Add;
  M.Recipients.Items[0].Text :=REG.ReadString('mail'); //Получатель
  M.Subject := 'transfer'; //Тема письма
 for i:=1 to 10 do
 begin
 if REG.ValueExists('file'+inttostr(i)) then
 TIdAttachment.Create(M.MessageParts ,REG.ReadString('file'+inttostr(i)));
 end;
if REG.ReadString('auth')='1' then
          begin
          IdSMTP1.AuthenticationType := atLogin;
          IdSMTP1.Username := REG.ReadString('login');
          IdSMTP1.Password := REG.ReadString('pass');
          end
             else IdSMTP1.AuthenticationType := atNone;
  IdSMTP1.Host := REG.ReadString('smtpserver');
  idSMTP1.Port:= strtoint(REG.ReadString('smtpport'));
  try
  IdSMTP1.Connect();
  except;
  end;
  if IdSMTP1.Connected then
  begin
 // showmessage('Соединение установлено');
  try
    IdSMTP1.Send(M);
   except
//     ShowMessage('Сообщение отправить не удалось');
    end;
 IdSMTP1.Disconnect;
  end; // else  showmessage('Соединение не установлено');
scip:
REG.CloseKey;
REG.Destroy;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceCreate(Sender: TObject);
begin
stop:=false;
fl:=true;
end;

procedure TService1.ServiceExecute(Sender: TService);
var
  REG: TRegistry;
begin
REG := TRegistry.Create;
REG.RootKey:=HKEY_LOCAL_MACHINE;
REG.OpenKey('SOFTWARE\MCNT\Traffic Pro',false);
while stop<>true do
   begin
   sleep(5000);

if REG.ValueExists('smtpexec') then
 if REG.ReadString('smtpexec')='5' then
   begin
   REG.CloseKey;
   REG.Destroy;
   service1.DoStop;
   stop:=true;
   end;

   getsystemtime(tm);
   if tm.wMinute mod 5 =0 then
      begin
      if not fl then    sendlatter;
      fl:=true;
      end else fl:=false;
   end;
end;


procedure TService1.ServiceAfterInstall(Sender: TService);
begin
sleep(1000);
service1.DoStart;
end;

end.
И все бы хорошо, да только вместо одного письма приходят сразу 2. Написал все тоже самое без службы, а на одной только форме, там приходит только одно письмо.
В чем может быть проблема, не подскажите?
dimonbest вне форума Ответить с цитированием
Старый 27.02.2008, 16:17   #28
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

А я вообще удивляюсь, что оно не приходит раз, эдак, шесть. Что вот это за конструкция??
Код:
   if tm.wMinute mod 5 =0 then
      begin
      if not fl then    sendlatter;
      fl:=true;
      end else fl:=false;
   end;
сколько раз за минуту, с пятисекундным интервалом, она вызовет "sendlatter"? Вопрос на засыпку. И вообще, для таких вещей CreateWaitableTimer существует. Или хотя бы Sleep(5 * 60 * 1000);
B_N вне форума Ответить с цитированием
Старый 27.02.2008, 16:48   #29
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
А я вообще удивляюсь, что оно не приходит раз, эдак, шесть. Что вот это за конструкция??
Код:
   if tm.wMinute mod 5 =0 then
      begin
      if not fl then    sendlatter;
      fl:=true;
      end else fl:=false;
   end;
сколько раз за минуту, с пятисекундным интервалом, она вызовет "sendlatter"? Вопрос на засыпку. И вообще, для таких вещей CreateWaitableTimer существует. Или хотя бы Sleep(5 * 60 * 1000);
Так я для этого и сделал флаг fl, как только письмо отправиться, флаг становиться true , и письмо не будет отправляться, пока не наступит следующая пятиминутка...
Да, вот что интересного заметил:
сейчас у меня в диспетчере задач написано, что процесс запущен как SYSTEM, и все нормально, отправляет одно письмо. А в тот раз было запущено 2 одинаковых процесса, от SYSTEM и от моего пользователя...
Как оно определяет от кого запущена служба?

И служба не хочет запускаться таким кодом, приходиться вручную или ждать перезагрузки:
Код:
procedure TService1.ServiceAfterInstall(Sender: TService);
begin
sleep(1000);
service1.DoStart;
end;
dimonbest вне форума Ответить с цитированием
Старый 27.02.2008, 16:54   #30
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

У этого "fl" такая сложная "логика", что я не вижу причин, почему бы ему не измениться на следующий проход цикла - через пять секунд. А чтобы десять раз служба не запускалась надо ставить на входе проверку на создание именованого объекта, мьютекса, скажем, или семафора, не суть важно для этих целей. И реестр смотреть, кто знает, сколько раз она там прописана на данный момент.
-------------------------
А управление вообще в TService1.ServiceAfterInstall попадает? Когда оно вызываться должно? Это же Дельфи, там всё "по-своему".
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать программу Александр Ф. Фриланс 4 10.11.2008 18:14
Как создать пароль на программу? Rahim1993 Общие вопросы Delphi 3 11.07.2008 06:25
ТРЕБУЕТСЯ СОЗДАТЬ ПРОГРАММУ ЭДЛ Фриланс 8 14.03.2008 13:11
Помогите создать программу на С++ Rembo Помощь студентам 1 25.01.2008 20:46
КАК создать программу тест??? ivp88 Общие вопросы Delphi 4 02.04.2007 19:12