|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.12.2006, 13:59 | #1 |
Пользователь
Регистрация: 13.12.2006
Сообщений: 13
|
проблема с клиент-сервер
Написал приложение по типу клиент-сервер...вроде бы все хорошо, коннетится, отправляет данный, носервер не выполняет команды, посланные клиентом ;(
Вот упрощенный код, где основная задача сервера заключается в том, что по команде клиента 'reboot' компьютер должен перезагрузить, но он чтото не грузится. //server procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ServerSocket.Close; end; procedure TForm1.ServerSocketClientRead(Sende r: TObject; Socket: TCustomWinSocket); var str: string; begin str:= Socket.ReceiveText; if str='reboot' then ExitWindowsEx(EWX_SHUTDOWN,0); end; procedure TForm1.ServerSocketError(Sender: TObject; Number: Smallint; var Description: string; Scode: Integer; const Source, HelpFile: string; HelpContext: Integer; var CancelDisplay: Wordbool); begin ShowMessage(Description); end. //client procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ClientSocket.Close; end; procedure TForm1.SpeedButton1Click(Sender: TObject); begin if connected then ClientSocket.Socket.SendText(Edit2. Text); end; procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin MessageBox(handle,PChar('Error connecting to'+Edit1.Text),'Error',mb_IconHand +mb_TaskModal); connected:= false; SpeedButton2.Caption:='Connect'; end; procedure TForm1.SpeedButton2Click(Sender: TObject); begin if connected then begin ClientSocket.Active:=false; SpeedButton2.Caption:='Connect'; connected:= false; end else begin try with ClientSocket do begin Host := Edit1.Text; Active := True; end; connected:= true; except connected:= false; SpeedButton2.Caption:='Connect'; end; end; end; procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin SpeedButton2.Caption:='Disonnect'; end; end. Жду ваших советов. |
13.12.2006, 16:37 | #2 |
Александр
Администратор
Регистрация: 28.10.2006
Сообщений: 17,608
|
Так какой код должен перезагружать?
|
13.12.2006, 18:22 | #3 | |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
Вот этот:
Цитата:
Код:
|
|
13.12.2006, 18:27 | #4 |
Студент
Форумчанин
Регистрация: 10.11.2006
Сообщений: 196
|
Попробуй reboot вот этой процедуркой
function MyExitWindows(RebootParam: Word): Boolean; function IsWin9x: Bool; {True = Win9x, False = NT} asm xor eax, eax mov ecx, cs xor cl, cl jecxz @@quit inc eax @@quit: end; var TTokenHd: Cardinal; TTokenPvg: TTokenPrivileges; cbtpPrevious: DWORD; rTTokenPvg: TTokenPrivileges; pcbtpPreviousRequired: DWORD; tpResult: Boolean; const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; begin if IsWin9x = False then begin tpResult := OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TTokenHd); if tpResult then begin tpResult := LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, TTokenPvg.Privileges[0].Luid); TTokenPvg.PrivilegeCount := 1; TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; cbtpPrevious := SizeOf(rTTokenPvg); pcbtpPreviousRequired := 0; if tpResult then Windows.AdjustTokenPrivileges(TToke nHd, False, TTokenPvg, cbtpPrevious, rTTokenPvg, pcbtpPreviousRequired); end; end; Result := ExitWindowsEx(RebootParam, 0); end; В твоем коду проблема в том, что у проги нет прав на то, чтобы выключить/перезагрузить Windows. To Alar: ExitWindowsEx(EWX_SHUTDOWN,0); //по видимому
Visita Interiorem Terrae Rectificando Operae Lapidem...
|
13.12.2006, 19:33 | #5 |
Пользователь
Регистрация: 13.12.2006
Сообщений: 13
|
To Cильванович Михаил
Огромное спасибо. Но все равно чтото не получается=( Я был бы вам очень благодарен если бы вы показали куда именно это впихнуть. И еще один вопрос- эта процедурка похоже только под вин9х и НТ, под ХП она прокатит? |
13.12.2006, 21:28 | #6 |
Delphi/C++/C#
Участник клуба
Регистрация: 29.10.2006
Сообщений: 1,972
|
Если в нт катит, то в хр тоже должна, в хр платформа-то нт.
|
13.12.2006, 22:08 | #7 |
Пользователь
Регистрация: 13.12.2006
Сообщений: 13
|
можете продемонстрировать как будет в итоге выглядеть код, а то я чтото не найду никак куда это вставить=(
Последний раз редактировалось khaz; 14.12.2006 в 12:36. |
14.12.2006, 13:38 | #8 |
Пользователь Подтвердите свой е-майл
Регистрация: 14.12.2006
Сообщений: 29
|
ExitWindowsEx(EWX_SHUTDOWN,0) работает только под win9х. Если NT или XP сначала нужно взять права администратора.
Делается это так: function SetPrivilege(aPrivilegeName: string; aEnabled: boolean): boolean; var TPPrev, TP: TTokenPrivileges; Token: THandle; dwRetLen: DWord; begin Result := False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token); TP.PrivilegeCount := 1; if (LookupPrivilegeValue(nil, PChar(aPrivilegeName), TP.Privileges[0].LUID)) then begin if (aEnabled) then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0; dwRetLen := 0; Result := AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen); end; CloseHandle(Token); end; след функция осуществляет непосредственно выход: function WinExit(iFlags: integer): boolean; begin Result := True; if (SetPrivilege('SeShutdownPrivilege' , true)) then begin if (not ExitWindowsEx(iFlags, 0)) then begin Result := False; end; SetPrivilege('SeShutdownPrivilege', False) end else begin Result := False; end; end; короче говоря - вставляешь вышеописаное себе в юнит и вместо ExitWindowsEx(EWX_SHUTDOWN,0) вписываешь WinExit(EWX_SHUTDOWN).
какой вопрос, такой ответ..
|
14.12.2006, 14:53 | #9 | |
Студент
Форумчанин
Регистрация: 10.11.2006
Сообщений: 196
|
Цитата:
а код самой функции встаить можно в любое место в модуле.
Visita Interiorem Terrae Rectificando Operae Lapidem...
|
|
14.12.2006, 15:16 | #10 |
Пользователь
Регистрация: 13.12.2006
Сообщений: 13
|
TO DROP TO МИХАИЛ
Tsenks ! все отлично работает чтобы я без вас делал Последний раз редактировалось khaz; 14.12.2006 в 15:45. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Клиент-сервер-клиент | Кронос | Работа с сетью в Delphi | 3 | 24.08.2007 07:57 |
Клиент-Сервер | snakesoft | Работа с сетью в Delphi | 8 | 20.07.2007 17:34 |
клиент сервер | Oksana1988 | Фриланс | 3 | 10.04.2007 12:12 |
Клиент-сервер | Scorpio | Работа с сетью в Delphi | 6 | 13.02.2007 22:57 |