![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как посмотреть переменные в другой программе? [D6, Win2k]
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 если нужно могу слить пример пиши на мыло