Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
Костик   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.007 c
15-1223826820
axis_of_evil
2008-10-12 19:53
2008.12.14
о наркотиках.


15-1223864011
Slider007
2008-10-13 06:13
2008.12.14
С днем рождения ! 11 октября 2008 суббота


3-1211360976
MegaVolt
2008-05-21 13:09
2008.12.14
Посоветуйте базу данных


2-1225361355
Sw
2008-10-30 13:09
2008.12.14
dll


15-1223904876
dr_creigan
2008-10-13 17:34
2008.12.14
проблемы с вистой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский