Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 22:02   #1
fack00
Пользователь
 
Регистрация: 25.04.2009
Сообщений: 19
Вопрос SendMessage и обработка сообщения

собственно отправляю своему приложению сообщение так:
Код:
var s:string;
...
s:='123asdxZZZ';
SendMessage(wda, WM_Mysetlinkmessage, 0, Integer(PChar(s)));
при приеме обрабатываю так:
Код:
sMemo5.lines.add(pchar(Message.lParam));
все работает верно, но если
Код:
строку
s:='123asdxZZZ';
заменить на
s:=paramstr(0);
то в Memo добавляется пустая строка. Как исправить?

Последний раз редактировалось fack00; 04.12.2010 в 23:02.
fack00 вне форума Ответить с цитированием
Старый 04.12.2010, 22:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Специально не поленился проверить:
Код:
unit Unit1;

interface

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

const   WM_Mysetlinkmessage=WM_USER+1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    sMemo5: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure w(var m:TMessage); message WM_Mysetlinkmessage;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
s:=ParamStr(0);
SendMessage(Handle, WM_Mysetlinkmessage, 0, Integer(PChar(s)));

end;

procedure TForm1.w(var m: TMessage);
begin

sMemo5.lines.add(pchar(M.lParam));

end;

end.
Все работает, как и предполагается.
Где-то ты накосячил в другом месте.
Цитата:
paramstr(0)<>0
Улыбнуло )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.12.2010, 23:11   #3
fack00
Пользователь
 
Регистрация: 25.04.2009
Сообщений: 19
По умолчанию

Stilet, создал новый проект и да, все работает (по вашему коду).

В моей же программе текст передается не самому себе, а другой копии программы..
ЗЫ
paramstr(0)<>0
ошибочка)
fack00 вне форума Ответить с цитированием
Старый 04.12.2010, 23:14   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дык естественно, вы в курсе про раздельное адресное пространство?
с этого и надо было начинать.
используйте WM_COPYDATA
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.12.2010, 23:17   #5
fack00
Пользователь
 
Регистрация: 25.04.2009
Сообщений: 19
По умолчанию

Пепел Феникса,
в курсе.
только почему один текст передается, а другой нет?

к примеру:
пусть paramstr(0)='C:\123.exe'
и s:='C:\123.exe';
так первое отправит, а второе нет..

я хочу вариант без буфера обмена..
fack00 вне форума Ответить с цитированием
Старый 04.12.2010, 23:23   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а приложение одно и тоже?
думаю да, просто совпал адрес константы.(а второе переменная и адрес не совпадет, да и не с чем)
Цитата:
я хочу вариант без буфера обмена..
я про него говорил?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.12.2010, 23:25   #7
fack00
Пользователь
 
Регистрация: 25.04.2009
Сообщений: 19
По умолчанию

Пепел Феникса, да. Налаживаю работу нескольких копий..)
про совпадение констант не понял..

Цитата:
Stilet, создал новый проект и да, все работает (по вашему коду).
работает, потому что в одной программе. если сделать между программный обмен - то результат такойже, как у меня
fack00 вне форума Ответить с цитированием
Старый 04.12.2010, 23:32   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

текстовая константа(как и любая другая, но там хитрости бывают) хранится внутри процесса всегда, и внутри копий одного и того же процесса имеют одинаковый адрес, вспомните историю Ирония Любви или с легким паром. почти тоже самое.

а если переменная, а не константа(то что вы присвоили константу-строку переменной строке не считается, до тех пор пока переменная не изменена), а Paramstr всегда вернет переменную, то это получается, что приперлись в чужой дом, по определенному адресу(вы его передаете сами), ломитесь, и в итоге конечно остаетесь ни с чем(а то и с AV).

надеюсь объяснил.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.12.2010, 23:40   #9
fack00
Пользователь
 
Регистрация: 25.04.2009
Сообщений: 19
По умолчанию

Пепел Феникса,
если я правильно понял:
это не текстовая константа, а числовая и т.к.
Цитата:
const WM_Mysetlinkmessage=WM_USER+1;
WM_USER не меняется, т.к. копии идентичны

Paramstr(0) - путь до exe копии программы и он может быть у каждой копии своей. (тип-строка)
я же передаю эту строку, как текст, а не запускаю или что-то еще..

в заключение, все должно работать, как часы. Но в силу каких-то невомых мне сил - don`t work!
fack00 вне форума Ответить с цитированием
Старый 04.12.2010, 23:47   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

приведения типов вспомните, и посмотрите что есть PChar.(это указатель)
в итоге вы передаете адрес строки.
Цитата:
пусть наша константа имеет адрес X(он постоянен).
тогда в случае передачи адреса X, получаем
П1(процесс1)->X="bla"
П2(процесс2)->X="bla"
все ОК.
Цитата:
теперь пусть ParamSTR(0) в П1 нам вернул строку, её адрес Y(каждый раз разный).
передаем адрес Y, получаем
П1->Y="C:/MyExe.exe"
П2->Y=Фига с маслом
ибо П2 и знать не знает о том что же лежало по адресу Y у П1.
поэтому я и советую применить сообщение WM_COPYDATA, которое за нас копирует данные из П1 в П2.(почитайте про него, не мало написано)
Цитата:
const WM_Mysetlinkmessage=WM_USER+1;
про идентификатор сообщения я вообще не говорил.
Цитата:
Но в силу каких-то невомых мне сил - don`t work!
я уже объяснил причину.
напомню что SendMessage принимает два Integer параметра, а не строки.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 05.12.2010 в 00:03.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SendMessage Damien4Damien Общие вопросы Delphi 3 29.09.2010 21:27
SendMessage ASЯ Помощь студентам 0 20.05.2010 10:38
Сообщения чужому окну - SendMessage Mufer Win Api 11 10.01.2010 23:48
Обработка сообщения отжатия левой кнопки мыши на компоненте TrackBar CyberJohn Общие вопросы Delphi 5 08.02.2009 12:34
Не работает SendMessage MaTBeu Win Api 6 01.10.2008 19:00