![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |
|
#3
|
|||
|
|||
|
Цитата:
Я не уверен, что до конца понял что ты имел ввиду, но посыл текста StartFTP и Hello возвращает на клиента сообщения, соответственно, о том, что фтп запушено и Hello, i am your server. При этом на StartFTP функция запуска FTPServer выполняется без нареканий. |
|
#4
|
|||
|
|||
|
Цитата:
на сколько я понял из ошибок SendText(lp) не сработает с сокетом... TStrings and String не совпадут... |
|
#5
|
||||
|
||||
|
Мда, срочно учить матчасть.
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
homeknight (03.04.2012)
| ||
|
#6
|
|||
|
|||
|
Может направишь в нужное русло?) Я понимаю, что туплю где-то, но прогу мне надо дописать все же...
да и вобще, я просто не доковырял до ума код, скопированный из блога зет. lp мне по сути не нужен... Код:
ServerSocket1.Socket.Connections[0].SendText(ExtractFileName(string(NameProc))); Последний раз редактировалось homeknight, 04.04.2012 в 00:04. |
|
#7
|
||||
|
||||
|
В этом коде ошибки не видно.
|
|
#8
|
|||
|
|||
|
Вопрос, нормально ли что я
Код:
GetProcessList(ServerSocket1: TServerSocket): TStrings; Извиняюсь за глупые вопросы, просто реально нет опыта и где искать его еще, кроме как в своих ошибках, не знаю, как и у кого спросить... так уж вышло, что преподы наши не могут просто физически успеть подсказать что-то... Поэтому спрашиваю тут, надеясь на таких вот добрых людей ![]() |
|
#9
|
||||
|
||||
|
Возвращается TStrings, но проверки на возвращаемое значение нигде нет. И в таком случае Вы несколько изменили оригинальный код. Там StringList является глобальной переменной и в функции он только очищается. У Вас же при каждом вызове идёт новое создание и ни одного деструктора.
|
|
#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; |
|
#12
|
|||
|
|||
|
Странно, но все равно не пашет... Ни на семерке, ни на xp
|
|
#13
|
||||
|
||||
|
Проверь для начала без серверных примочек в "чистую", чтобы убедиться, что получаешь список процессов, а уж дальше думай.
|
|
#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. |