Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает программа [D7, XP]


Костик ©   (2008-11-11 09:28:00) 


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.

При передачи во входной поток данных Windows сообщает что в программе обнаружена ошибка и она будет закрыта. Где тут ошибка?


Сергей М.   (2008-11-11 11:02:00) [1]


> Костик   (11.11.08 10:53) [5]


Ну используй тогда этоткод, раз он работает, в чем проблема-то ?
Не понятно ..


Костик   (2008-11-11 10:53:00) [2]

Вот ё-маё, а что же тогда за проблема.
Вот в этой программе ничего особенного, может кроме того, что она запускается с ключом  -t:

// 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 email from stdin

messageContent := '';
while (not eof(Input)) do
begin
  readln(Input, s);
  messageContent := messageContent + s + #13#10;
end;

// 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;

debugLog просто пишет в файл... Свою я запускаю без ключа. Вот незадача то...


Сергей М.   (2008-11-11 10:41:00) [3]

Цикл вида

while (not eof(Input)) do
begin
  readln(Input, s);
  ..
end;


принципиально ничем не отличается от цикла вида

while True do
begin
 Win32Check(ReadFile(h,buf,SizeOf(buf),n,Nil));
 if n = 0 then
    Break;
 buf[n] := #0;
 ...
end;


И здесь и там выполняется построчное чтение из стандартного потока ввода, до тех пор пока во вх.потоке не обнаружен EOF


Костик   (2008-11-11 10:28:00) [4]

Большое спасибо. Вы настоящий друг.
Ощибка теперь не появляется но и файл не создается.
Из консоли да, но когда ее вызвает функция библиотеки dll то не работает.
Другая программа, которая работает, испльзует конструкцию:

mymessage := '';
while (not eof(Input)) do
begin
  readln(Input, s);
  messageContent := mymessage + s + #13#10;
end;


Сергей М.   (2008-11-11 10:01:00) [5]


program TestConsole;

{$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);
 AssignFile(f, 'report.txt');
 try
   try
     Append(f);
   except
     Rewrite(f);
   end;
   try
     while True do
     begin
       Win32Check(ReadFile(h,buf,SizeOf(buf),n,Nil));
       if n = 0 then
         Break;
       buf[n] := #0;
       Write(f,buf);
     end;
   finally
     Flush(f);
     CloseFile(f);
   end;
 except
//  обработка исключений
 end;
end.


Сергей М.   (2008-11-11 09:43:00) [6]

When a synchronous read operation reaches the end of a file, ReadFile returns TRUE and sets *lpNumberOfBytesRead to zero. The following sample code tests for end-of-file for a synchronous read operation:

// attempt a synchronous read operation  
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL) ;
// check for eof
if (bResult &&  nBytesRead == 0, ) {
// we're at the end of the file
}


Наверх

Титульная страница Поиск, карта сайта Написать письмо