Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как посмотреть переменные в другой программе? [D6, Win2k]


Страницы:   1 2

ev ©   (2001-12-15 19:24:00) 

сабж


ev   (2001-12-24 15:31:00) [1]

Огромнейшее спасибо!!! Буду пробовать ....


Polevi   (2001-12-23 15:39:00) [2]

2ev - лови

Server


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TData=record
Param1:integer;
Param2:double;
end;

type
PData=^TData;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
clientList:TList;
procedure OnCopyData(var Msg:TMessage);message WM_COPYDATA;
procedure ReceiveData(handle:HWND;data:PData);
procedure GetDataFromAll;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.OnCopyData(var Msg: TMessage);
var
cds:^TCopyDataStruct;
begin
cds:=Pointer(Msg.LParam);
if cds.cbData=0 then clientList.Add(Pointer(Msg.wParam))
else
ReceiveData(Msg.wParam,cds.lpData);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
clientList:=TList.Create;
Caption:="Server";
end;

procedure TForm1.ReceiveData(handle:HWND;data: PData);
begin
ShowMessage(Format("%d %f",[data.Param1,data.Param2]));
end;

procedure TForm1.GetDataFromAll;
var
i:integer;
begin
for i:=0 to clientList.Count-1 do SendMessage(Integer(clientList[i]),WM_COPYDATA,0,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetDataFromAll;
end;

end.




Клиент


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;


type
TData=record
Param1:integer;
Param2:double;
end;

type
PData=^TData;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
serverHandle:HWND;
procedure SendData;
procedure OnCopyData(var Msg:TMessage);message WM_COPYDATA;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
cds:TCopyDataStruct;
begin
cds.cbData:=0;
cds.lpData:=nil;
ServerHandle:=FindWindow(nil,"Server");
SendMessage(ServerHandle,WM_COPYDATA,Handle,Integer(@cds));
end;

procedure TForm1.OnCopyData(var Msg: TMessage);
begin
SendData;
end;

procedure TForm1.SendData;
var
cds:TCopyDataStruct;
data:PData;
begin
new(data);
data.Param1:=1234;
data.Param2:=1234.5678;
cds.cbData:=Sizeof(TData);
cds.lpData:=data;
SendMessage(ServerHandle,WM_COPYDATA,Handle,Integer(@cds));
dispose(data);
end;

end.


Polevi   (2001-12-23 14:27:00) [3]

2Юрий Зотов ©
Ну вот, теперь все знают, что я не в курсе, что такое WM_COPYDATA :))


ev   (2001-12-22 10:56:00) [4]

хочется примерчик SendMessage + WM_COPYDATA !!! :)


Юрий Зотов   (2001-12-21 15:36:00) [5]

> Polevi © (21.12.01 12:32)

Как ни странно, но указатель действительно передать можно. Причем указатель на любую структуру любых данных. Для этого и служит WM_COPYDATA.


ValeraVV   (2001-12-21 13:45:00) [6]

E:\Program Files\Borland\Delphi5\Demos\Activex\Oleauto\Autoserv
прекрасный примерчик


ev   (2001-12-21 13:09:00) [7]

мастера подкиньте примерчик ;)

заранее благодарен!


Polevi   (2001-12-21 12:32:00) [8]

Угу, в чужом адресном пространстве


XPDeveloper   (2001-12-21 03:01:00) [9]

да можно и указатель передать в виде одного параметра на структуру с миллионом параметров.


Polevi   (2001-12-20 09:37:00) [10]

ev © (19.12.01 19:51)
Кстати, а сразу 3 переменные в одном сообщении передать нельзя?

--------------------------------------------------------------------------------

в lParam и wParam можно поместить 8 байт - 1 double, 2 integer, 4 smallint, 8 byte :))


XPDeveloper   (2001-12-19 23:51:00) [11]

Если проги твои - вообще проблем нет
Нет ничего проще передать адрес класса (как integer), который знает и программа получатель, так зарегистрируешь класс во второй проге. И вперед, с песнями. Надо предусмотреть и unregister при закрытии проги.
А так - пиши Com-класс, вставляй адаптер в твой Делфи класс, интерфейс знаком будет обоим прогам - и гоняй даты без проблем. Это уже глобалное решение проблем. С этим можно и чужим прогам работать. С событиями можно напороться на несовместимость, особенно когда пользуешь чужие custom-controls, а с Сom можно удаленно работать.


ev   (2001-12-19 19:51:00) [12]

Кстати, а сразу 3 переменные в одном сообщении передать нельзя?


ev   (2001-12-19 19:48:00) [13]

а примерчик .... ;)

P.S. силенок пока для winAPI нет :(


Polevi   (2001-12-19 18:13:00) [14]

PS
Чтобы вырубить клиента можно послать ему WM_CLOSE или сообщение, зарегестрированное специально для этих целей


Polevi   (2001-12-19 18:11:00) [15]

2ev@
если обе программы твои - тогда можно сделать так
сначала запускается Y (сервер)
X (клиент) при запуске находит сервер и посылает ему сообщение (например WM_IAMHERE и в lParam передает handle своего окна)

если кол-во переменных небольшое - для каждого регистрируешь свое сообщние (WM_GETVAR1,WM_GETVAR2,WM_GETVAR3)

Когда сервер желает получить значения переменной от клиента - он шлет ему сообщние (hwnd был получен при старте клиента) - WM_GETVAR1
Клиент получает это сообщние, и посылает серверу WM_GETVAR1 со значением переменной в lParam


ev   (2001-12-19 16:40:00) [16]

Да, вопрос задан не совсем правильно (буду учиться ;)).
Поясню....
Есть программа X. В ней (например) 3 переменные.
Программа Xзапущена с разными параметрами (например) 100 раз.
Есть программа Y. Ей требуется получить список запущенных программ Xи значения этих 3-х переменных (для каждого экземпляра - значения разные).
Еще нужна возможность из Yвырубать конкретную X.

Повторюсь ... обе программы мои ;)

P.S. Можно примерчик SendMessage + WM_COPYDATA ?


Юрий Зотов   (2001-12-19 13:47:00) [17]

> ev © (18.12.01 20:18)

Есди обе программы Ваши, то никаких проблем нет. Как уже говорили, можно использовать File Mapping (см. CreateFileMapping и MapViewOfFile). Можно поступить и проще - одна программа отправляет другой запрос, а в ответ получает любую информацию (см. SendMessage и WM_COPYDATA). Можно использовать COM-технологию. И т.д. - способов много. Самый простой, наверное - это SendMessage + WM_COPYDATA.

А путаница получилась из-за того, что Вы спросили именно о значении переменной. Когда программист говорит о переменной, то имеется в виду переменная в памяти, а не текст контрола. Так Вас и поняли, так и начали отвечать.


Polevi   (2001-12-19 13:31:00) [18]

2Юрий Зотов
Шуткой я посчитал вопрос - Как посмотреть переменные в другой программе?
А вот ваш ответ >Ответ очевиден: OpenProcess + ReadProcessMemory.
- ничего смешного, по моему. (то есть все правильно но никакой практической пользы)

>Думаю, вдаваться в подробное обсуждение нет смысла
Согласен



Someone   (2001-12-19 02:34:00) [19]

2 ev
Ну если обе программы твои, то может лучше организовать нормальное сообщение между ними, через, например, TCP? Кстати это пригодится и в том случае, когда эти две программы работают на разных компьютерах.


Dimaond Cat   (2001-12-19 02:15:00) [20]

создай файл в памяти и запихивай туда значения переменных и считывай их оттуда.
CreateFileMapping если нужно могу слить пример пиши на мыло


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо