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

Вниз

Как посмотреть переменные в другой программе?   Найти похожие ветки 

 
ev ©   (2001-12-15 19:24) [0]

сабж


 
Polevi ©   (2001-12-15 20:35) [1]

Также, как и постоянные


 
Вадим ©   (2001-12-16 23:33) [2]

т.е. никак


 
VladD2 ©   (2001-12-17 00:37) [3]

А кто нибудь из отвечающих Рихтера читал?
Если извесны адреса этих переменных в адресном пространстве другого процесса, то очень даже можно. Как? Читайте Рихтера. (см. http://www.rsdn.ru/res/book/?win32/winpro.xml )


 
ev ©   (2001-12-17 17:36) [4]

А если эти переменные выводить в TLabel на главной форме?


 
Suntechnic ©   (2001-12-17 17:40) [5]

> VladD2 © (17.12.01 00:37)
Всего то 2 проблемы:
1) Попасть в это адресное пространство
2) Знать эти адреса



 
erik ©   (2001-12-17 18:52) [6]

Использй SharedMemoryFile.


 
ev ©   (2001-12-17 19:36) [7]

Если найти окно (FindWindow), то потом теоретически можно узнать значение в TLabel (TLabel - тоже теоретически окно).

Вопрос: как это сделать?

P.S. у окна-то Caption узнать можно, почему labe1.caption нельзя узнать?


 
Юрий Зотов ©   (2001-12-17 19:50) [8]

> ev © (17.12.01 19:36)

1. > TLabel - тоже теоретически окно.
НЕТ! И еще раз: НЕТ!
TLabel - это просто рисунок. Окно - это TStaticText.

2. > у окна-то Caption узнать можно, почему labe1.caption нельзя узнать?
Вот как раз поэтому и нельзя. Для Windows никаких TLabel просто не существует. В принципе.

3. И вообще, какое отношение имеет TLabel к данному сабжу?


 
ev ©   (2001-12-17 20:56) [9]

> Юрий Зотов
> TLabel - это просто рисунок. Окно - это TStaticText.
Хорошо, тогда переформулируем вопрос: как узнать, чтот находится в TStaticText (и если их несколько) ?

> И вообще, какое отношение имеет TLabel к данному сабжу?

var
x: integer;
...
label1.caption:=inttostr(x);
...



 
Dimaond Cat ©   (2001-12-18 01:34) [10]

на статиктекст можно выслать сообщение
sendmessage(хендл статиктекста,wm_gettext,кол-во символов ,Cardinal(Pchar(Cds.lpdata))) где CDS это TCopyDataStruct


 
ev ©   (2001-12-18 12:04) [11]

а как получить хендл статиктекста? ;)


 
Виктор Щербаков ©   (2001-12-18 12:29) [12]

FindWindowEx


 
Юрий Зотов ©   (2001-12-18 14:52) [13]

> ev

Вопрос звучал: "Как посмотреть переменные в другой программе?"

Ответ очевиден: OpenProcess + ReadProcessMemory. О чем и говорили с самого начала VladD2 и другие. Естественно, никакие TLabel здесь ни при чем. Потому что проблема не в том, как ВЫВЕСТИ эти значения, а как их ПОЛУЧИТЬ.

Но, судя по Вашим следующим сообщениям, первоначальный вопрос Вы задали неверно и на самом деле Вам нужен всего лишь текст контрола на чужом окне. Если это так, то см. сообщения Dimaond Cat и Виктора Щербакова. А также архивы и FAQ - этот вопрос повторяется, как минимум, дважды в неделю.


 
Polevi ©   (2001-12-18 15:58) [14]

2Юрий Зотов
ReadProcessMemory это замечательно, но это чисто академический совет - присоединяюсь к вопросу Suntechnic © - как узнать адрес переменной ?


 
Digitman ©   (2001-12-18 16:45) [15]

>Polevi
Не понял)
imho, <Юрий Зотов> блестяще определился в развитии ситуации с вопросами автора (а не <Suntechnic> - он не автор
) по ходу дискуссии


 
Polevi ©   (2001-12-18 17:06) [16]

ok :)


 
Юрий Зотов ©   (2001-12-18 17:53) [17]

> Polevi
как узнать адрес переменной ?

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

ОК?


 
ev ©   (2001-12-18 20:18) [18]

Какая разница как получить значение переменной (статиктексту всегда можно присвоить значение переменной)!
Т.е. задача получить значение переменной, а получить можно любым способом! ;)

Но глюк в том, что я не могу понять, как это сделать (winAPI не знаю :().

Может кто поделится исходником?

P.S. обе программы мои (переменную могу писать куда хочу)


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

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


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

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


 
Polevi ©   (2001-12-19 13:31) [21]

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

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




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

> ev © (18.12.01 20:18)

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

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


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

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

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

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



 
Polevi ©   (2001-12-19 18:11) [24]

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

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

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


 
Polevi ©   (2001-12-19 18:13) [25]

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


 
ev ©   (2001-12-19 19:48) [26]

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

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


 
ev ©   (2001-12-19 19:51) [27]

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


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

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


 
Polevi ©   (2001-12-20 09:37) [29]

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

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

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


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

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


 
Polevi ©   (2001-12-21 12:32) [31]

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


 
ev ©   (2001-12-21 13:09) [32]

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

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


 
ValeraVV ©   (2001-12-21 13:45) [33]

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


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

> Polevi © (21.12.01 12:32)

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


 
ev ©   (2001-12-22 10:56) [35]

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


 
Polevi ©   (2001-12-23 14:27) [36]

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


 
Polevi ©   (2001-12-23 15:39) [37]

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.


 
ev ©   (2001-12-24 15:31) [38]

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



Страницы: 1 вся ветка

Текущий архив: 2002.02.25;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.014 c
7-79494
neverbee
2001-11-20 11:07
2002.02.25
Вывод текста поверх других окон. Как?


14-79468
Пиноккио
2002-01-08 20:11
2002.02.25
Термопринтер


14-79433
_SnAke_
2002-01-03 13:16
2002.02.25
Профессиональный праздник


14-79448
Феликс
2002-01-07 21:34
2002.02.25
Жванцкого побили....


14-79464
Polevi
2002-01-08 18:50
2002.02.25
Мерлину