Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.015 c
3-1195444789
Бакук
2007-11-19 06:59
2008.04.13
Слетает &amp;laquo;привязка&amp;raquo; к датамодулю


2-1205824359
Pavelkq
2008-03-18 10:12
2008.04.13
Как вставить в TList элементы integer?


2-1205424109
HelloEverybody
2008-03-13 19:01
2008.04.13
Компилятор пропускает команду...


4-1186816191
Игорь_1
2007-08-11 11:09
2008.04.13
Listbox


15-1204018720
@!!ex
2008-02-26 12:38
2008.04.13
Синхронизация потоков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский