Форум: "Начинающим";
Текущий архив: 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("íó åïòà");
Write(buf);
Until n<>SizeOf(buf);
//Ïèøåì â ôàéë
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