Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.14;
Скачать: CL | DM;

Вниз

Консольное приложение   Найти похожие ветки 

 
Костик   (2008-11-07 12:02) [0]

Сам работаю с php. Хочу сделать локальную заглушку для отправки емайл сообщений. Чтобы эти сообщения из крипта php передавались в мою программку и сохранялись на диске. Вот набросал... Только не пойму одну вешь - зацикливаеся на обходе stdin ПОчему? В это же время из скрипта php передаются параметры но тоже зацикливается скорее всего ибо файл не создает...

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils, Classes;

var messageContent, s: string;
   f:TextFile;
   i:integer;
   sl:TStringList;
begin
 messageContent := "";
 while (not eof(Input)) do
 begin
   readln(Input, s);
   messageContent := messageContent + s + #13#10;
 end;

 AssignFile(f, "report.txt");
 try
  Reset(f);
 except
  Rewrite(f);
 end;
 sl := TStringList.Create;
 try
   sl.Text := messageContent;
   for i := 0 to sl.Count - 1 do
     WriteLn(f,sl[i]);
 finally
   sl.Free;
 end;
 Flush(f);
 CloseFile(f);
end.


 
Юрий Зотов ©   (2008-11-07 12:08) [1]

Как Вы себе представляете конец sdtin?
То есть, когда eof(Input) должно стать true?


 
Palladin ©   (2008-11-07 12:09) [2]

он не зацикливается, eof при вызове input ждет ввода
читать нужно из stdinput
GetStdHandle +F1


 
Костик   (2008-11-07 12:19) [3]


> он не зацикливается, eof при вызове input ждет ввода

Та значит скрипт ничего не передаёт? Или как?
Как можно передать текст программе в коммандной строке?


 
Palladin ©   (2008-11-07 12:23) [4]


> Та значит скрипт ничего не передаёт?

понятия не имею, но если в Input нет данных, eof ждет ввода


 
Сергей М. ©   (2008-11-07 12:23) [5]


> Как можно передать текст программе в коммандной строке?


На то и командная строка, чтобы с пом. нее передавать текст.

Или ты хотел спросить, как получить эту ком.строку ?

см. ParamCount, ParamStr()


 
Palladin ©   (2008-11-07 12:27) [6]


> понятия не имею, но если в Input нет данных, eof ждет ввода

точнее если в Input болше нет данных, то бишь ты уже все прочитал


 
Костик   (2008-11-07 12:28) [7]


> > Как можно передать текст программе в коммандной строке?

Я вызываю из cmd программу... Она ожидает ввода в input... Как мне туда опрпвить данные чтобы они сохранились в файле? Написать после project1.exe ????


 
Palladin ©   (2008-11-07 12:29) [8]

а что такое cmd ?


 
Костик   (2008-11-07 12:36) [9]


> а что такое cmd ?

Пуск/выполнить/cmd
Кстате когда запускаю скрпит Винда выдает сообщение что в project1.exe обнаружена ошибка и оно будет закрыто... - это значит что скприпт запускает  и передает в project1.exe данные


 
Palladin ©   (2008-11-07 12:37) [10]

Project1 :
program Project1;

{$APPTYPE CONSOLE}

uses
Windows,
 SysUtils;

var
h:THandle;
buf:Array [0..1023] of Char;
n:Cardinal;
begin
h:=GetStdHandle(STD_INPUT_HANDLE);
Repeat
 If Not ReadFile(h,buf,SizeOf(buf),n,Nil) Then Raise Exception.Create("ну епта");
 Write(buf);
Until n<>SizeOf(buf);
end.


1.txt:
1
22
333
44
5


[путь]>project1.exe < 1.txt


 
Сергей М. ©   (2008-11-07 12:40) [11]


> Пуск/выполнить/cmd


Таким макаром ты можешь передать параметры стартуемому приложению именно через ком.строку.


 
Костик   (2008-11-07 12:48) [12]

Код я брали из ивзестной сенд маил проги для виндовс. Вот кусок исходника:

var

 smtpServer    : string;
 smtpPort      : string;
 defaultDomain : string;
 messageContent: string;
 authUsername  : string;
 authPassword  : string;
 forceSender   : string;
 pop3server    : string;
 pop3username  : string;
 pop3password  : string;
 hostname      : string;
 isPickup      : boolean;

 reg : TRegistry;
 ini : TCustomIniFile;
 pop3: TIdPop3;
 smtp: TIdSmtp;

 i     : integer;
 s     : string;
 found : boolean;
 ss    : TStringStream;
 msg   : TIdMessage;
 sl    : TStringList;
 header: boolean;
 fs    : TFileStream;

begin

 // check parameters to make sure "-t" was provided

 found := False;
 for i := 1 to ParamCount do
   if (ParamStr(i) = "-t") then
   begin
     found := True;
     break;
   end;

 if (not found) then
 begin
   writeln(ErrOutput, "sendmail requires -t parameter");
   halt(1);
 end;

 // read default domain from registry

 reg := TRegistry.Create;
 try
   reg.RootKey := HKEY_LOCAL_MACHINE;
   if (reg.OpenKeyReadOnly("\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters")) then
     defaultDomain := reg.ReadString("Domain");
 finally
   reg.Free;
 end;

 // read ini

 s := ChangeFileExt(ParamStr(0), ".ini");
 if (FileExists(s)) then
   ini := TIniFile.Create(s)
 else
 begin
   ini := TRegistryIniFile.Create("\software");
   TRegistryIniFile(ini).RegIniFile.RootKey := HKEY_LOCAL_MACHINE;
   TRegistryIniFile(ini).RegIniFile.OpenKey(TRegistryIniFile(ini).FileName, true);
 end;

 try

   smtpServer    := ini.ReadString("sendmail", "smtp_server",    "mail.mydomain.com");
   smtpPort      := ini.ReadString("sendmail", "smtp_port",      "25");
   defaultDomain := ini.ReadString("sendmail", "default_domain", defaultDomain);
   hostname      := ini.ReadString("sendmail", "hostname",       "");
   errorLogFile  := ini.ReadString("sendmail", "error_logfile",  "");
   debugLogFile  := ini.ReadString("sendmail", "debug_logfile",  "");
   authUsername  := ini.ReadString("sendmail", "auth_username",  "");
   authPassword  := ini.ReadString("sendmail", "auth_password",  "");
   forceSender   := ini.ReadString("sendmail", "force_sender",   "");
   pop3server    := ini.ReadString("sendmail", "pop3_server",    "");
   pop3username  := ini.ReadString("sendmail", "pop3_username",  "");
   pop3password  := ini.ReadString("sendmail", "pop3_password",  "");

   if (smtpServer = "mail.mydomain.com") or (defaultDomain = "mydomain.com") then
   begin
     writeln(ErrOutput, "You must configure the smtp_server and default_domain in:");
     writeln(ErrOutput, "  " + ini.fileName);
     writeln(ErrOutput, "  or");
     writeln(ErrOutput, "  HKLM\Software\Sendmail");
     halt(1);
   end;

 finally
   ini.Free;
 end;

 if (errorLogFile <> "") and (ExtractFilePath(errorLogFile) = "") then
   errorLogFile := ExtractFilePath(ParamStr(0)) + errorLogFile;

 if (debugLogFile <> "") and (ExtractFilePath(debugLogFile) = "") then
   debugLogFile := ExtractFilePath(ParamStr(0)) + debugLogFile;

 isPickup := DirectoryExists(smtpServer);
 if (isPickup) then
   smtpServer := IncludeTrailingPathDelimiter(smtpServer);

 // read email from stdin

 messageContent := "";
 while (not eof(Input)) do
 begin
   readln(Input, s);
   messageContent := messageContent + s + #13#10;
 end;
  GetStdHandle
 // make sure message is CRLF delimited

 if (pos(#10, messageContent) = 0) then
   messageContent := stringReplace(messageContent, #13, #13#10, [rfReplaceAll]);

 if (debugLogFile <> "") then
 begin
   debugLog("--- MESSAGE BEGIN ---");
   sl := TStringList.Create;
   try
     sl.Text := messageContent;
     for i := 0 to sl.Count - 1 do
       debugLog(sl[i]);
   finally
     sl.Free;
   end;
   debugLog("--- MESSAGE END ---");
 end;

 // fix multiple to, cc, bcc and subject fields

 messageContent := joinMultiple(messageContent, "to");
 messageContent := joinMultiple(messageContent, "cc");
 messageContent := joinMultiple(messageContent, "bcc");
 messageContent := joinMultiple(messageContent, "subject");

 // deliver message

 {$IFDEF USE_MADEXCEPT}
 RegisterExceptionHandler(madExceptionHandler, stTrySyncCallAlways);
 {$ENDIF}

 try
и так даллеее......

Только она почемуто передает сообщение, а моя вызывает ошибку..
PS: project1.exe <1.txt -отрабатывает корректно...


 
Костик   (2008-11-07 13:40) [13]


program Project1;

{$APPTYPE CONSOLE}

uses
 Windows,
 SysUtils;

var
h:THandle;
buf:Array [0..1023] of Char;
n:Cardinal;
f:textfile;
i:integer;
begin
h:=GetStdHandle(STD_INPUT_HANDLE);
Repeat
If Not ReadFile(h,buf,SizeOf(buf),n,Nil) Then Raise Exception.Create("&#237;&#243; &#229;&#239;&#242;&#224;");
Write(buf);
Until n<>SizeOf(buf);
//&#207;&#232;&#248;&#229;&#236; &#226; &#244;&#224;&#233;&#235;
AssignFile(f, "report.txt");
 try
  Reset(f);
 except
  Rewrite(f);
 end;
 try
   for i := 0 to n - 1 do
     Write(f,buf[i]);
 finally
 end;
 Flush(f);
 CloseFile(f);
end.

В приложении обнаружена ошибка. Подпись
szAppName : Project1.exe     szAppVer : 0.0.0.0     szModName : kernel32.dll
szModVer : 5.1.2600.2180     offset : 0001eb33  
Содержание отчета
C:\DOCUME~1\Asup50\LOCALS~1\Temp\WER24f5.dir00\Project1.exe.mdmp
C:\DOCUME~1\Asup50\LOCALS~1\Temp\WER24f5.dir00\appcompat.txt


 
Palladin ©   (2008-11-07 13:44) [14]


> В приложении обнаружена ошибка.

кто бы сомневался... такую фню лепить...


 
Костик   (2008-11-07 13:46) [15]


> кто бы сомневался... такую фню лепить.

ага, все такие умные одния я дурак


 
Palladin ©   (2008-11-07 13:47) [16]

выходит, что так...


 
Костик   (2008-11-07 13:53) [17]

можно между прочим и подсказать раз у вас тут форум для новичков... а если вы будете только говорить что новички фигню лепят то сюда никто и ходить не захочет... смысл?.. а новички везде фигню лепят - им не надо это говорить... а если не помагать зачем вообще этот сайт с таким форумом...


 
Palladin ©   (2008-11-07 13:55) [18]

я тебе пример дал, для того что бы ты в нем разобрался, по [13] я вижу что ты ни хрена в нем не разбирался, и желание помочь резко упало к нулю

http://delphimaster.net/view/16-1208434700/


 
Костик   (2008-11-07 14:02) [19]


>  тебе пример дал, для того что бы ты в нем разобрался,

я и разобрался, что ты в  буфер пишешь содержимое входа пока там чё есть... вот я его в файл и записал...


 
Anatoly Podgoretsky ©   (2008-11-07 16:30) [20]


> ага, все такие умные одния я дурак

Не волнуйся, ты не один.



Страницы: 1 вся ветка

Текущий архив: 2008.12.14;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
6-1196592064
Fixi4eeG
2007-12-02 13:41
2008.12.14
Отправка данных методом POST через IdHTTP


15-1223863730
Slider007
2008-10-13 06:08
2008.12.14
С днем рождения ! 13 октября 2008 понедельник


2-1225628984
lamer6666
2008-11-02 15:29
2008.12.14
Как узнать какая ошибка возникает при выполнении запроса в MySQL?


2-1225456605
JustI
2008-10-31 15:36
2008.12.14
Оптимизация


2-1225870583
Scarllett
2008-11-05 10:36
2008.12.14
Как ухапшить файл