![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Консольное приложение [D7, XP]
Костик © (2008-11-07 12:02:00)Сам работаю с 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.
Anatoly Podgoretsky (2008-11-07 16:30:00) [1]
> ага, все такие умные одния я дурак
Не волнуйся, ты не один.
Костик (2008-11-07 14:02:00) [2]
> тебе пример дал, для того что бы ты в нем разобрался,
я и разобрался, что ты в буфер пишешь содержимое входа пока там чё есть... вот я его в файл и записал...
Palladin (2008-11-07 13:55:00) [3]я тебе пример дал, для того что бы ты в нем разобрался, по [13] я вижу что ты ни хрена в нем не разбирался, и желание помочь резко упало к нулю
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1208434700&n=6
Костик (2008-11-07 13:53:00) [4]можно между прочим и подсказать раз у вас тут форум для новичков... а если вы будете только говорить что новички фигню лепят то сюда никто и ходить не захочет... смысл?.. а новички везде фигню лепят - им не надо это говорить... а если не помагать зачем вообще этот сайт с таким форумом...
Palladin (2008-11-07 13:47:00) [5]выходит, что так...
Костик (2008-11-07 13:46:00) [6]
> кто бы сомневался... такую фню лепить.
ага, все такие умные одния я дурак
Palladin (2008-11-07 13:44:00) [7]
> В приложении обнаружена ошибка.
кто бы сомневался... такую фню лепить...
Костик (2008-11-07 13:40:00) [8]
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 nSizeOf(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
Костик (2008-11-07 12:48:00) [9]Код я брали из ивзестной сенд маил проги для виндовс. Вот кусок исходника:
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 12:40:00) [10]
> Пуск/выполнить/cmd
Таким макаром ты можешь передать параметры стартуемому приложению именно через ком.строку.
Palladin (2008-11-07 12:37:00) [11]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:36:00) [12]
> а что такое cmd ?
Пуск/выполнить/cmd
Кстате когда запускаю скрпит Винда выдает сообщение что в project1.exe обнаружена ошибка и оно будет закрыто... - это значит что скприпт запускает и передает в project1.exe данные
Palladin (2008-11-07 12:29:00) [13]а что такое cmd ?
Костик (2008-11-07 12:28:00) [14]
> > Как можно передать текст программе в коммандной строке?
Я вызываю из cmd программу... Она ожидает ввода в input... Как мне туда опрпвить данные чтобы они сохранились в файле? Написать после project1.exe ????
Palladin (2008-11-07 12:27:00) [15]
> понятия не имею, но если в Input нет данных, eof ждет ввода
точнее если в Input болшенет данных, то бишь ты уже все прочитал
Сергей М. (2008-11-07 12:23:00) [16]
> Как можно передать текст программе в коммандной строке?
На то и командная строка, чтобы с пом. нее передавать текст.
Или ты хотел спросить, как получитьэту ком.строку ?
см. ParamCount, ParamStr()
Palladin (2008-11-07 12:23:00) [17]
> Та значит скрипт ничего не передаёт?
понятия не имею, но если в Input нет данных, eof ждет ввода
Костик (2008-11-07 12:19:00) [18]
> он не зацикливается, eof при вызове input ждет ввода
Та значит скрипт ничего не передаёт? Или как?
Как можно передать текст программе в коммандной строке?
Palladin (2008-11-07 12:09:00) [19]он не зацикливается, eof при вызове input ждет ввода
читать нужно из stdinput
GetStdHandle +F1
Юрий Зотов (2008-11-07 12:08:00) [20]Как Вы себе представляете конец sdtin?
То есть, когда eof(Input) должно стать true?