Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 225

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Помогите переделать этот консольный сервер под форму, чтобы запускать/останавливать сервер по нажатию кнопки на форме , от не знания мучаюсь уже два дня бестолку, заранее благодарен;

Приложение:
  1. program RemoteControlServer;
  2. {$apptype console}
  3.  
  4. uses
  5. Windows,SysUtils,Classes,ScktComp,Graphics,Jpeg;
  6.  
  7. type
  8. TSCThread=class(TServerClientThread)
  9. private
  10. Bitmap:TBitmap;
  11. Jpeg:TJpegImage;
  12. protected
  13. procedure GrabScreen(Stream:TStream;const ImgSize:TPoint);
  14. procedure ClientExecute; override;
  15. public
  16. constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
  17. destructor Destroy; override;
  18. end;
  19.  
  20. constructor TSCThread.Create(CreateSuspended: Boolean;
  21. ASocket: TServerClientWinSocket);
  22. begin
  23. Bitmap:=TBitmap.Create;
  24. Jpeg:=TJpegImage.Create;
  25. inherited;
  26. end;
  27.  
  28. destructor TSCThread.Destroy;
  29. begin
  30. Jpeg.Free;
  31. Bitmap.Free;
  32. inherited;
  33. end;
  34.  
  35. procedure TSCThread.GrabScreen(Stream:TStream;const ImgSize:TPoint);
  36. var
  37. Desktop:HWnd;
  38. DesktopRect: TRect;
  39. DesktopDC:HDc;
  40. begin
  41. Stream.Size:=0;
  42. Desktop:=GetDesktopWindow;
  43. GetWindowRect(Desktop,DesktopRect);
  44. Bitmap.Height:=ImgSize.Y;
  45. Bitmap.Width:=ImgSize.X;
  46. DesktopDC:=GetWindowDC(Desktop);
  47. try
  48. Win32Check(StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
  49. DesktopDC,DesktopRect.Left,DesktopRect.Top,DesktopRect.Right,DesktopRect.Bottom, SRCCOPY));
  50. finally
  51. ReleaseDC(Desktop,DesktopDC);
  52. end;
  53. Jpeg.Assign(Bitmap);
  54. Jpeg.SaveToStream(Stream);
  55. end;
  56.  
  57. procedure TSCThread.ClientExecute;
  58. var
  59. ScreenStream:TMemoryStream;
  60. Buf:array[0..1023] of byte;
  61. ImgSize:TPoint;
  62. size:integer;
  63. begin
  64. while (not Terminated) and ClientSocket.Connected do
  65. try
  66. ScreenStream:=TMemoryStream.Create;
  67. try
  68. if ClientSocket.ReceiveBuf(ImgSize,SizeOf(ImgSize))<>SizeOf(ImgSize) then exit;
  69. GrabScreen(ScreenStream,ImgSize);
  70. ScreenStream.Position:=0;
  71. size:=ScreenStream.Size;
  72. ClientSocket.SendBuf(size,SizeOf(size));
  73. while ScreenStream.Position<ScreenStream.Size do
  74. begin
  75. size:=ScreenStream.Read(Buf,SizeOf(Buf));
  76. if ClientSocket.SendBuf(Buf,size)<>size then exit;
  77. end;
  78. finally
  79. ScreenStream.Free;
  80. end;
  81. except
  82. Terminate;
  83. HandleException;
  84. end;
  85. end;
  86.  
  87. function Proc2Method(Code,Data:pointer):TMethod;
  88. begin
  89. result.Code:=Code;
  90. result.Data:=Data;
  91. end;
  92.  
  93. procedure GetThread(self,Sender: TObject; ClientSocket: TServerClientWinSocket;
  94. var SocketThread: TServerClientThread);
  95. begin
  96. SocketThread:=TSCThread.Create(true,ClientSocket);
  97. SocketThread.Priority:=tpLower;
  98. SocketThread.Resume;
  99. end;
  100.  
  101. var Server:TServerSocket;
  102.  
  103. begin
  104. Server:=TServerSocket.Create(nil);
  105. try
  106. Server.ServerType:=stThreadBlocking;
  107. Server.OnGetThread:=TGetThreadEvent(Proc2Method(@GetThread,Server));
  108. Server.Port:=1234;
  109. Server.Active:=true;
  110. while Server.Active do Sleep(100);
  111. finally
  112. Server.Free;
  113. end;
  114. end.


DimonZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 24 апреля 2011, 15:14
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 27 апреля 2011, 05:23; участников в обсуждении: 2.
Егор

Егор (статус: 10-ый класс), 24 апреля 2011, 16:43 [#1]:

а в чём проблема-то? что именно не получается?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
DimonZ

DimonZ (статус: Посетитель), 24 апреля 2011, 23:09 [#2]:

Проблема в том что я не силен с работой с сокетами в потоках.
Егор

Егор (статус: 10-ый класс), 27 апреля 2011, 05:23 [#3]:

так код же есть? что мешает его оформить в отдельный модуль (unit)?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.02 сек.