![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть программа, состаящая из клиента и сервера. Клиент отправляет сообщение через ServerSocket, сервер анализирует и в зависимости от полученного сообщения выполняет действия(или ничего не делает)
В чем именно проблема я не знаю, но сервер не присылает список программ... Программу списываю с http://www.xakep.ru/post/12475/ Процедуру сбора сведений о полученных процессах взял тут: http://zetblog.ru/programming/200812/winapi-получить список-запущенных-процесс/ Поковырял немного и получилось вот так: Код:
function GetProcessList(ServerSocket1: TServerSocket): TStrings; var eP: TProcessEntry32; hP, snap: THandle; hM: hmodule; prcs: array[0..$FFF] of dword; cP, cM: cardinal; i: integer; NameProc: array[0..max_path] of char; begin lP:=TStringList.Create; lP.Clear; if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin //если это Win9x snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0); if integer(snap) = -1 then begin exit; end else begin eP.dwSize := sizeof(eP); if Process32First(snap, eP) then repeat lP.Add(string(eP.szExeFile)); until not Process32Next(snap, eP); end; end else begin if not EnumProcesses(@prcs, sizeof(prcs), cP) then begin exit; end; for i := 0 to cP div 4 - 1 do begin hP := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, prcs[i]); if hP > 0 then begin EnumProcessModules(hP, @hM, 4, cM); GetModuleFileNameEx(hP, hM, NameProc, sizeof(NameProc)); ServerSocket1.Socket.Connections[0].SendText(ExtractFileName(string(NameProc))); lP.Add(string(NameProc)); CloseHandle(hP); end; end; end; end; при этом вызов функции идет из: Код:
begin a:=Socket.ReceiveText; if a ='hello' then Socket.SendText('Hello, i`m you server'); RichEdit1.Lines.Add(a); if a= 'StartFTP' then begin FTPServer1.Start; Socket.SendText('FTP Server started'); end; if a= 'StopFTP' then begin FTPServer1.DisconnectAll; FTPServer1.Stop; Socket.SendText('FTP Server stoped'); if a='lp' then GetProcessList(ServerSocket1); //этой строки if copy(a,1,2) = 'dp' then delproc(copy(a,4,Length(a)-3)); end; end; Возвращает ничего. Пожалуйста, помогите разобраться... я в делфи новичек и, возможно, допускаю какую-нибудь глупую ошибку в коде... Но спросить не у кого... Последний раз редактировалось homeknight, 04.04.2012 в 00:43. |
#2
|
||||
|
||||
![]() Уверен, что
Код:
a := Socket.ReceiveText; Код:
lP:=TStringList.Create; lP.Clear; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() Цитата:
Я не уверен, что до конца понял что ты имел ввиду, но посыл текста StartFTP и Hello возвращает на клиента сообщения, соответственно, о том, что фтп запушено и Hello, i am your server. При этом на StartFTP функция запуска FTPServer выполняется без нареканий. |
#4
|
|||
|
|||
![]() Цитата:
на сколько я понял из ошибок SendText(lp) не сработает с сокетом... TStrings and String не совпадут... |
#5
|
||||
|
||||
![]() Мда, срочно учить матчасть.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
homeknight (03.04.2012)
|
#6
|
|||
|
|||
![]() Может направишь в нужное русло?) Я понимаю, что туплю где-то, но прогу мне надо дописать все же...
да и вобще, я просто не доковырял до ума код, скопированный из блога зет. lp мне по сути не нужен... Код:
ServerSocket1.Socket.Connections[0].SendText(ExtractFileName(string(NameProc))); Последний раз редактировалось homeknight, 04.04.2012 в 00:04. |
#7
|
||||
|
||||
![]() В этом коде ошибки не видно.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
![]() Вопрос, нормально ли что я
Код:
GetProcessList(ServerSocket1: TServerSocket): TStrings; Извиняюсь за глупые вопросы, просто реально нет опыта и где искать его еще, кроме как в своих ошибках, не знаю, как и у кого спросить... так уж вышло, что преподы наши не могут просто физически успеть подсказать что-то... Поэтому спрашиваю тут, надеясь на таких вот добрых людей ![]() |
#9
|
||||
|
||||
![]() Возвращается TStrings, но проверки на возвращаемое значение нигде нет. И в таком случае Вы несколько изменили оригинальный код. Там StringList является глобальной переменной и в функции он только очищается. У Вас же при каждом вызове идёт новое создание и ни одного деструктора.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#10
|
|||
|
|||
![]() Запилил оригинал с zetblog.ru, набросал форму с memo1 и button1, button2.
Вот тут: Код:
if not EnumProcesses(@prcs, sizeof(prcs), cP) then .... EnumProcessModules(hP, @hM, 4, cM); ..... Выдает предупреждения [Warning] Unit1.pas(63): Unsafe code '@ operator' [Warning] Unit1.pas(76): Unsafe code '@ operator' Запускается, но не работает( |
#11
|
||||
|
||||
![]() Вот это оригинал:
Код:
{ **** UBPFD *********** by delphibase.endimus.com **** >> Получение списка процессов в Windows 9x/NT Определяет список модулей, запущенных в настоящее время в системе, и заносит их имена в список TStrings. На Win9x использует функции ToolHelp32, на NT/2000/XP - библиотеку PSAPI.dll Зависимости: Windows, Classes, PSAPI, TlHelp32 Автор: Евгений Пелега, drpass@mail.ru, Донецк Copyright: Евгений Пелега Дата: 26 апреля 2002 г. ***************************************************** } procedure GetProcessList(var sl: TStrings); var pe: TProcessEntry32; ph, snap: THandle; //дескрипторы процесса и снимка mh: hmodule; //дескриптор модуля procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов count, cm: cardinal; //количество процессов i: integer; ModName: array[0..max_path] of char; //имя модуля begin sl.Clear; if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin //если это Win9x snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0); if integer(snap) = -1 then begin exit; end else begin pe.dwSize := sizeof(pe); if Process32First(snap, pe) then repeat sl.Add(string(pe.szExeFile)); until not Process32Next(snap, pe); end; end else begin //Если WinNT/2000/XP if not EnumProcesses(@procs, sizeof(procs), count) then begin exit; end; for i := 0 to count div 4 - 1 do begin ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, procs[i]); if ph > 0 then begin EnumProcessModules(ph, @mh, 4, cm); GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName)); sl.Add(string(ModName)); CloseHandle(ph); end; end; end; end; Пример использования: Код:
procedure TForm1.Button1Click(Sender: TObject); var tmp: TStrings; begin tmp := memo1.Lines; GetProcessList(tmp); end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
|||
|
|||
![]() Странно, но все равно не пашет... Ни на семерке, ни на xp
|
#13
|
||||
|
||||
![]() Проверь для начала без серверных примочек в "чистую", чтобы убедиться, что получаешь список процессов, а уж дальше думай.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#14
|
|||
|
|||
![]() Исправляюсь... неправильно запилил его... Спасибо за пример, буду разбираться.
Последний раз редактировалось homeknight, 04.04.2012 в 00:58. |
#15
|
|||
|
|||
![]() Список получаю, пытаюсь сделать вывод на сокет.
Вот вопрос из серии базовые знания: Код:
if a='lp' then begin GetProcessList(ServerSocket1); end; Такое обращение к созданному на форме серверсокету верно при вызове процедуры? И в самой процедуре совсем глупый вопрос возникает Код:
procedure GetProcessList(var ServerSocket1:TServerSocket); //тут верно ли указал и будет вобще процедура обращаться к компоненту ServerSocket1 на форме... var pe: TProcessEntry32; ph, snap: THandle; mh: hmodule; procs: array[0..$FFF] of dword; count, cm: cardinal; i: integer; ModName: array[0..max_path] of char; begin if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0); if integer(snap) = -1 then begin exit; end else begin pe.dwSize := sizeof(pe); if Process32First(snap, pe) then repeat Form1.ServerSocket1.Socket.Connections[0].SendText(string(pe.szExeFile));//в данной строке until not Process32Next(snap, pe); end; end else begin if not EnumProcesses(@procs, sizeof(procs), count) then begin exit; end; for i := 0 to count div 4 - 1 do begin ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, procs[i]); if ph > 0 then begin EnumProcessModules(ph, @mh, 4, cm); GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName)); Form1.ServerSocket1.Socket.Connections[0].SendText(string(ModName)); CloseHandle(ph); end; end; end; end; Последний раз редактировалось homeknight, 04.04.2012 в 01:25. |