Главная страница
    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.012 c
8-1132228825
CondAL
2005-11-17 15:00
2006.04.23
проиграть события в midi файлах


15-1143832767
Новочеркасский Волк
2006-03-31 23:19
2006.04.23
Проводник удалённого компьютера.


15-1144273946
Yegorchic
2006-04-06 01:52
2006.04.23
Файл и папка


2-1144740195
User_OKA
2006-04-11 11:23
2006.04.23
Процедура с параметром


1-1142857647
StriderMan
2006-03-20 15:27
2006.04.23
Как реализовать SPA (безопасная проверка пароля)





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