Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
1-79351
mrcat
2002-02-07 18:51
2002.02.25
комиляция числовых выражений


6-79412
eblade
2001-12-08 21:56
2002.02.25
TClientSocket.OnWrite


6-79408
dimonf
2001-12-06 18:10
2002.02.25
Построение отчетов с помощью HTML


1-79338
ЕвгенийА
2002-02-08 01:20
2002.02.25
Вопрос по формам...


1-79354
Lord_Vader
2002-02-08 04:49
2002.02.25
Конвертор для DFM-файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский