Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

сообщения в программу по сети   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
15-1204077242
Fon
2008-02-27 04:54
2008.04.13
Как заранее проверить влезет текст в TMemo или выдаст ошибку?


2-1205762898
Михаил
2008-03-17 17:08
2008.04.13
Компонент для выбора толщины и вида линии


2-1205943484
oletta
2008-03-19 19:18
2008.04.13
корень третьей степени


15-1204204156
dr_creigan
2008-02-28 16:09
2008.04.13
DDK XP


2-1205828693
Aleksandrrr
2008-03-18 11:24
2008.04.13
вложенный запрос