Форум: "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