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

Вниз

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

Наверх





Память: 0.47 MB
Время: 0.025 c
6-1136925616
AT
2006-01-10 23:40
2006.04.23
Получить рабочюю группу по IP адресу


15-1143653618
Kolan
2006-03-29 21:33
2006.04.23
Совместимось bpl пакетов Delphi 2006 с Delphi 7.


4-1139077583
Vlad_Ladynin
2006-02-04 21:26
2006.04.23
Эмуляция нажатия горячих клавиш.


2-1144754608
dabreezy
2006-04-11 15:23
2006.04.23
Вопрос по TidHTTP


15-1144227742
sergeii
2006-04-05 13:02
2006.04.23
Pocket PC





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский