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

Вниз

Try if and GetLastError   Найти похожие ветки 

 
balepa ©   (2006-03-30 10:54) [0]

Здрасьте, Всем
Посмотрите кому не лень, правильно ли расставил if"ы и try"и
Еще и варниг вылазит:
[Warning] ServerUnit.pas(115): Variable "SBuf" might not have been initialized нужно ли от него "избавится"(если да то как) или ничего "страшного" не случится (имеется ввиду не приведет когда нибудь к ошибкам)
Еще если неправильно указать путь к фаилу в CreateProcess должно попадать в except, если да то почему не попадает, а GetLastError(если его вызвать в "else") выдает операция выполнена успешно

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
 SI: TStartupInfo;
 PI: TProcessInformation;
 ComLine: AnsiString;
 Len: Integer;
 RBuf: Pointer;
 SBuf: ^Byte;
 Data: Double;
begin
 Len:= Socket.ReceiveLength;
 GetMem(RBuf,Len);
 try
   Socket.ReceiveBuf(RBuf^,Len);
   Data:= Double(RBuf^);
   ComLine:= FloatToStr(Data);
   Len:= Pos(",",ComLine);
   ComLine:= Copy(ComLine,1,Len-1) + Copy(ComLine,Len+1,Length(ComLine));
   GetStartupInfo(SI);
   SI.wShowWindow := SW_NORMAL;
   try
   CreateProcess(PChar("C:\Windows\Рабочий стол\Process.exe"), PChar(ComLine), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
   if pi.hProcess > 0 then
     begin
     Inc(QueryG);
     LQueryG.Caption:= IntToStr(QueryG);
     GetMem(SBuf,SizeOf(Byte));
     SBuf^:= 77;
     inc(QueryWork);
     Inc(QueryCount);
     LQueryCount.Caption:= IntToStr(QueryCount);
     LQueryWork.Caption:= IntToStr(QueryWork);
     end
   else begin
     ErrorLog("Process NOT Started",Socket.RemoteHost);
     GetMem(SBuf,SizeOf(Byte));
     SBuf^:= 2;
   end;
   except
     //oherError
     ErrorLog(SysErrorMessage(GetLastError),Socket.RemoteHost);
   end;
   CloseHandle(PI.hProcess);
 finally
   try
     Socket.SendBuf(SBuf^,SizeOf(Byte));
   except
     ErrorLog(SysErrorMessage(GetLastError),Socket.RemoteHost);
   end;
   FreeMem(RBuf,SizeOf(Byte));
   FreeMem(SBuf,SizeOf(Byte));
 end;
 Socket.Close;
end;


 
Grom PE ©   (2006-03-30 11:24) [1]

Можно поставить SBuf:=nil перед первым try
Остальное - ой, лень :)


 
balepa ©   (2006-03-30 11:32) [2]


> Grom PE ©   (30.03.06 11:24) [1]

Да и за это спасибо, а че я то не додумался?
А в чем смысл варнинга? Я же всеравно присваиваю SBuf"у значение.


 
Думкин ©   (2006-03-30 11:33) [3]

В страницу не влазит.


 
Nikolay M. ©   (2006-03-30 11:44) [4]


>    try
>    CreateProcess(PChar("C:\Windows\Рабочий стол\Process.
> exe"), PChar(ComLine), nil, nil, false, NORMAL_PRIORITY_CLASS,
>  nil, nil, si, pi);
>    if pi.hProcess > 0 then
>      begin
>      Inc(QueryG);
>      LQueryG.Caption:= IntToStr(QueryG);
>      GetMem(SBuf,SizeOf(Byte));
>      SBuf^:= 77;
>      inc(QueryWork);
>      Inc(QueryCount);
>      LQueryCount.Caption:= IntToStr(QueryCount);
>      LQueryWork.Caption:= IntToStr(QueryWork);
>      end
>    else begin
>      ErrorLog("Process NOT Started",Socket.RemoteHost);
>      GetMem(SBuf,SizeOf(Byte));
>      SBuf^:= 2;
>    end;
>    except
>      //oherError
>      ErrorLog(SysErrorMessage(GetLastError),Socket.RemoteHost);
>
>    end;


Если чисто умозрительно при CreateProcess у тебя возникнет Exception, SBuf останется непроинициализированным. А после этого в finally ты попытаешься записать данные из SBuf в сокет и скорее всего получишь Access Violation.


 
BiN ©   (2006-03-30 11:49) [5]

Несколько замечаний:
1) if pi.hProcess > 0 then
я бы заменил на
if CreateProcess(...) then
т.к. ты не обнуляешь структуру PI до вызова CreateProcess.
2) заменил бы
ErrorLog(SysErrorMessage(GetLastError),Socket.RemoteHost);
на
on E:Exception do ErrorLog(E.Message,Socket.RemoteHost)


 
balepa ©   (2006-03-30 11:52) [6]


> BiN ©   (30.03.06 11:49) [5]

Спасибо, учтемс.


> Nikolay M. ©   (30.03.06 11:44) [4]

Спасибо, недоглядел.


 
Nikolay M. ©   (2006-03-30 11:56) [7]


> Спасибо, недоглядел.


Это хуже чем недоглядел. Это означает, что ты не представляешь себе логику работу этого куска кода :(
Конечно, ворнинги немного помогают, но лучше, если программа сразу пишется так, чтобы их не было изначально.


 
balepa ©   (2006-03-30 12:08) [8]


> Nikolay M. ©   (30.03.06 11:56) [7]

Это имено недоглядел, ИМХО. Просто несколько "проектов" одновременно (VB, Delphi) вот и запарился.

Только не спрашивайте почему все на Delphi не делаю.


 
Nikolay M. ©   (2006-03-30 12:15) [9]


> Это имено недоглядел, ИМХО.


Ну, хорошо, если так.



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

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

Наверх




Память: 0.49 MB
Время: 0.035 c
15-1144095238
systemis
2006-04-04 00:13
2006.04.23
Новейший Delphi проэкт


15-1143992025
Marser
2006-04-02 19:33
2006.04.23
Банный лист


6-1136735022
Цукор5
2006-01-08 18:43
2006.04.23
WSACleanup


15-1143661111
Piter
2006-03-29 23:38
2006.04.23
Лукьяненко - "Черновик"


3-1141321521
ihtiandr
2006-03-02 20:45
2006.04.23
Функция номера записи