Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
Внизсообщения в программу по сети Найти похожие ветки
← →
Adios (2008-03-18 16:05) [0]допустим есть 2 компа в одной рабочей группе с извесными именами и ипшниками, могу ли я отправить к примеру такое сообщение (sendmessage(hwnd,BM_CLICK,1,1);) на другой комп? если да то подскажите где я могу про это подробнее почитать или приведите пример.
← →
Игорь Шевченко © (2008-03-18 16:07) [1]net send
← →
Adios (2008-03-18 16:13) [2]а можно вызвать нужную функцию приложения на другой машине?, и можноли получить хендл приложения по сети?
← →
clickmaker © (2008-03-18 16:18) [3]
> а можно вызвать нужную функцию приложения на другой машине?,
>
RPC, DCOM
и что такое "хендл приложения"?
← →
Adios (2008-03-18 19:42) [4]нашол код который должен показывать процессы на сетевом компе
unit lanprocessexplorer;
interface
uses
Windows, SysUtils, Classes,Dialogs;
type
TPerfCounter = record
Counter: Integer;
Value: TLargeInteger;
end;
TPerfCounters = Array of TPerfCounter;
TPerfInstance = class
private
FName: string;
FCounters: TPerfCounters;
public
property Name: string read FName;
property Counters: TPerfCounters read FCounters;
end;
TPerfObject = class
private
FList: TList;
FObjectID: DWORD;
FMachine: string;
function GetCount: Integer;
function GetInstance(Index: Integer): TPerfInstance;
procedure ReadInstances;
public
property ObjectID: DWORD read FObjectID;
property Item[Index: Integer]: TPerfInstance
read GetInstance; default;
property Count: Integer read GetCount;
constructor Create(const AMachine: string; AObjectID: DWORD);
destructor Destroy; override;
end;
procedure GetProcesses(const Machine: string; List: TStrings);
implementation
type
PPerfDataBlock = ^TPerfDataBlock;
TPerfDataBlock = record
Signature: array[0..3] of WCHAR;
LittleEndian: DWORD;
Version: DWORD;
Revision: DWORD;
TotalByteLength: DWORD;
HeaderLength: DWORD;
NumObjectTypes: DWORD;
DefaultObject: Longint;
SystemTime: TSystemTime;
PerfTime: TLargeInteger;
PerfFreq: TLargeInteger;
PerfTime100nSec: TLargeInteger;
SystemNameLength: DWORD;
SystemNameOffset: DWORD;
end;
PPerfObjectType = ^TPerfObjectType;
TPerfObjectType = record
TotalByteLength: DWORD;
DefinitionLength: DWORD;
HeaderLength: DWORD;
ObjectNameTitleIndex: DWORD;
ObjectNameTitle: LPWSTR;
ObjectHelpTitleIndex: DWORD;
ObjectHelpTitle: LPWSTR;
DetailLevel: DWORD;
NumCounters: DWORD;
DefaultCounter: Longint;
NumInstances: Longint;
CodePage: DWORD;
PerfTime: TLargeInteger;
PerfFreq: TLargeInteger;
end;
PPerfCounterDefinition = ^TPerfCounterDefinition;
TPerfCounterDefinition = record
ByteLength: DWORD;
CounterNameTitleIndex: DWORD;
CounterNameTitle: LPWSTR;
CounterHelpTitleIndex: DWORD;
CounterHelpTitle: LPWSTR;
DefaultScale: Longint;
DetailLevel: DWORD;
CounterType: DWORD;
CounterSize: DWORD;
CounterOffset: DWORD;
end;
PPerfInstanceDefinition = ^TPerfInstanceDefinition;
TPerfInstanceDefinition = record
ByteLength: DWORD;
ParentObjectTitleIndex: DWORD;
ParentObjectInstance: DWORD;
UniqueID: Longint;
NameOffset: DWORD;
NameLength: DWORD;
end;
PPerfCounterBlock = ^TPerfCounterBlock;
TPerfCounterBlock = record
ByteLength: DWORD;
end;
{Navigation helpers}
function FirstObject(PerfData: PPerfDataBlock): PPerfObjectType;
begin
Result := PPerfObjectType(DWORD(PerfData) + PerfData.HeaderLength);
end;
function NextObject(PerfObj: PPerfObjectType): PPerfObjectType;
begin
Result := PPerfObjectType(DWORD(PerfObj) + PerfObj.TotalByteLength);
end;
function FirstInstance(PerfObj: PPerfObjectType): PPerfInstanceDefinition;
begin
Result := PPerfInstanceDefinition(DWORD(PerfObj) + PerfObj.DefinitionLength);
end;
function NextInstance(PerfInst: PPerfInstanceDefinition): PPerfInstanceDefinition;
var
PerfCntrBlk: PPerfCounterBlock;
begin
PerfCntrBlk := PPerfCounterBlock(DWORD(PerfInst) + PerfInst.ByteLength);
Result := PPerfInstanceDefinition(DWORD(PerfCntrBlk) + PerfCntrBlk.ByteLength);
end;
function FirstCounter(PerfObj: PPerfObjectType): PPerfCounterDefinition;
begin
Result := PPerfCounterDefinition(DWORD(PerfObj) + PerfObj.HeaderLength);
end;
← →
Adios (2008-03-18 19:43) [5]
function NextCounter(PerfCntr: PPerfCounterDefinition): PPerfCounterDefinition;
begin
Result := PPerfCounterDefinition(DWORD(PerfCntr) + PerfCntr.ByteLength);
end;
{Registry helpers}
function GetPerformanceKey(const Machine: string): HKey;
var
s: string;
begin
Result := 0;
if Length(Machine) = 0 then
Result := HKEY_PERFORMANCE_DATA
else
begin
s := Machine;
if Pos("\\", s) <> 1 then
s := "\\" + s;
if RegConnectRegistry(PChar(s), HKEY_PERFORMANCE_DATA, Result) <> ERROR_SUCCESS then
Result := 0;
end;
end;
{TPerfObject}
constructor TPerfObject.Create(const AMachine: string; AObjectID: DWORD);
begin
inherited Create;
FList := TList.Create;
FMachine := AMachine;
FObjectID := AObjectID;
ReadInstances;
end;
destructor TPerfObject.Destroy;
var
i: Integer;
begin
for i := 0 to FList.Count - 1 do
TPerfInstance(FList[i]).Free;
FList.Free;
inherited Destroy;
end;
function TPerfObject.GetCount: Integer;
begin
Result := FList.Count;
end;
function TPerfObject.GetInstance(Index: Integer): TPerfInstance;
begin
Result := FList[Index];
end;
procedure TPerfObject.ReadInstances;
var
PerfData: PPerfDataBlock;
PerfObj: PPerfObjectType;
PerfInst: PPerfInstanceDefinition;
PerfCntr, CurCntr: PPerfCounterDefinition;
PtrToCntr: PPerfCounterBlock;
BufferSize: Integer;
i, j, k: Integer;
pData: PLargeInteger;
Key: HKey;
CurInstance: TPerfInstance;
begin
for i := 0 to FList.Count - 1 do
TPerfInstance(FList[i]).Free;
FList.Clear;
Key := GetPerformanceKey(FMachine);
if Key = 0 then Exit;
PerfData := nil;
try
{Allocate initial buffer for object information}
BufferSize := 65536;
GetMem(PerfData, BufferSize);
{retrieve data}
while RegQueryValueEx(Key,
PChar(IntToStr(FObjectID)), {Object name}
nil, nil, Pointer(PerfData), @BufferSize) = ERROR_MORE_DATA do
begin
{buffer is too small}
Inc(BufferSize, 1024);
ReallocMem(PerfData, BufferSize);
end;
RegCloseKey(HKEY_PERFORMANCE_DATA);
{Get the first object type}
PerfObj := FirstObject(PerfData);
{Process all objects}
for i := 0 to PerfData.NumObjectTypes - 1 do
begin
{Check for requested object}
if PerfObj.ObjectNameTitleIndex = FObjectID then
begin
{Get the first counter}
PerfCntr := FirstCounter(PerfObj);
if PerfObj.NumInstances > 0 then
begin
{Get the first instance}
PerfInst := FirstInstance(PerfObj);
{Retrieve all instances}
for k := 0 to PerfObj.NumInstances - 1 do
begin
{Create entry for instance}
CurInstance := TPerfInstance.Create;
CurInstance.FName := WideCharToString(PWideChar(DWORD(PerfInst) +
PerfInst.NameOffset));
FList.Add(CurInstance);
CurCntr := PerfCntr;
{Retrieve all counters}
SetLength(CurInstance.FCounters, PerfObj.NumCounters);
for j := 0 to PerfObj.NumCounters - 1 do
begin
PtrToCntr := PPerfCounterBlock(DWORD(PerfInst) + PerfInst.ByteLength);
pData := Pointer(DWORD(PtrToCntr) + CurCntr.CounterOffset);
{Add counter to array}
CurInstance.FCounters[j].Counter := CurCntr.CounterNameTitleIndex;
CurInstance.FCounters[j].Value := pData^;
{Get the next counter}
CurCntr := NextCounter(CurCntr);
end;
{Get the next instance.}
PerfInst := NextInstance(PerfInst);
end;
end;
end;
{Get the next object type}
PerfObj := NextObject(PerfObj);
end;
finally
{Release buffer}
FreeMem(PerfData);
{Close remote registry handle}
if Key <> HKEY_PERFORMANCE_DATA then
RegCloseKey(Key);
end;
end;
procedure GetProcesses(const Machine: string; List: TStrings);
var
Processes: TPerfObject;
i, j: Integer;
ProcessID: DWORD;
begin
Processes := nil;
List.Clear;
try
Processes := TPerfObject.Create(Machine, 230); {230 = Process}
for i := 0 to Processes.Count - 1 do
{Find process ID}
for j := 0 to Length(Processes[i].Counters) - 1 do
if (Processes[i].Counters[j].Counter = 784) then
begin
ProcessID := Processes[i].Counters[j].Value;
//showmessage(inttostr(i)+"|"+inttostr(j));
if ProcessID <> 0 then
List.AddObject(Processes[i].Name, Pointer(ProcessID));
Break;
end;
finally
Processes.Free;
end;
end;
end.
если в procedure GetProcesses(const Machine: string; List: TStrings); указать в качестве первого параметра имя компа на котором запущена программа то всё правильно работает, но если имя сетевого компа то параметр List не заполняется помогите найти ошибку в коде из за которой непоказывает процессы в компе по сети.
← →
palva © (2008-03-18 19:55) [6]А зачем вы запускаете код который вам непонятен. Разбираться в нем вы не собираетесь, вопросов на эту тему не задаете. Вам же написали в [3] с чего начать изучение.
И что же? Нам в этом потыренном где-то коде ошибку искать?
← →
Adios (2008-03-18 20:00) [7]он работает, может неправильно процедуру вызываю? просто я с сетями до этого ниразу не сталкивался, а писать подобное с нуля своими знаниями уйдёт немало времени.
← →
Leonid Troyanovsky © (2008-03-18 21:00) [8]
> palva © (18.03.08 19:55) [6]
> И что же? Нам в этом потыренном где-то коде ошибку искать?
Дейс-но, краденном.
By Yorai Aminov:
http://www.rsdn.ru/Forum/Message.aspx?mid=897191&only=1
--
Regards, LVT.
← →
Adios (2008-03-18 21:09) [9]так я и не говорил что он мой, если бы он был мой , я не просил бы помощи в его использовании, как правильно вызвать процедуру? может дополнительные библиотеки нужны? буду благодарен если поможете.
← →
Игорь Шевченко © (2008-03-18 21:20) [10]процессы на удаленном компе прекрасно смотрятся через WMI
← →
Adios (2008-03-18 21:23) [11]WMI это компонента такая чтоли?
← →
Leonid Troyanovsky © (2008-03-18 21:29) [12]
> Adios (18.03.08 21:09) [9]
> просил бы помощи в его использовании, как правильно вызвать
> процедуру? может дополнительные библиотеки нужны?
Прежде всего, на удаленном хосте должна работать служба
удаленного реестра.
Ну, и права должны соответствовать.
--
Regards, LVT.
← →
trubin © (2008-03-18 21:31) [13]
> WMI это компонента такая чтоли?
http://www.intuit.ru/department/os/compromtwin/10/
← →
Игорь Шевченко © (2008-03-18 21:33) [14]
> WMI это компонента такая чтоли?
Эта...ты когда незнакомое слово увидишь, ты у гугля спрашивай. Или у Яндекса - они всяко быстрее ответят.
← →
Adios (2008-03-18 21:55) [15]
> служба
> удаленного реестра
как узнать работает ли она?, просто у меня виндовс ИКСПИ обрезан, установочный файл весит 175 меиров.
← →
Leonid Troyanovsky © (2008-03-18 22:10) [16]
> Adios (18.03.08 21:55) [15]
> как узнать работает ли она?
http://rsdn.ru/?article/baseserv/svcadmin-2.xml
> просто у меня виндовс ИКСПИ обрезан
http://msdn.microsoft.com forever.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c