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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2013, 21:36   #1
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию Не получается принять сообщение (SendMessage)

Программу компилирую в Лазарусе. В качестве обучалки использую эту статью.
В моей программе не происходит вызов WMCopyData. Пожалуйста, помогите решить эту проблему.

Вот мой код:

Sender (здесь всё работает нормально, так как Receiver, скомпилированный автором той статьи, принимает сообщение от моего Sender'a):
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,FileUtil,Buttons;
type
  { TForm1 }
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    StringEdit: TEdit;
    procedure BitBtn1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
 const
  CMD_SETLABELTEXT = 1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  CDS: TCopyDataStruct;
begin
  //Устанавливаем тип команды
  CDS.dwData := CMD_SETLABELTEXT;
  //Устанавливаем длину передаваемых данных
  CDS.cbData := Length(StringEdit.Text) + 1;
  //Выделяем память буфера для передачи данных
  GetMem(CDS.lpData, CDS.cbData);
  try
    //Копируем данные в буфер
    StrPCopy(CDS.lpData, AnsiString(StringEdit.Text));
    //Отсылаем сообщение в окно с заголовком StringReceiver
    SendMessage(FindWindow(nil, 'StringReceiver'),
                  WM_COPYDATA, Handle, Integer(@CDS));
  finally
    //Высвобождаем буфер
    FreeMem(CDS.lpData, CDS.cbData);
  end;
end;
end.
Receiver (не происходит вызов WMCopyData):
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,FileUtil,Buttons;
type
  TWMCopyData = packed record
    Msg: Cardinal;
    From: HWND;
    CopyDataStruct: PCopyDataStruct;
    Result: Longint;
  end;
  { TForm1 }
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    { private declarations }
	procedure WMCopyData(var MessageData: TWMCopyData); message WM_COPYDATA;
  public
    { public declarations }
  end;
var
  Form1: TForm1;
 const
  CMD_SETLABELTEXT = 1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.WMCopyData(var MessageData: TWMCopyData);
begin
  //Устанавливаем свойства метки, если заданная команда совпадает
  if MessageData.CopyDataStruct.dwData = CMD_SETLABELTEXT then
  begin
    //Устанавливаем текст из полученных данных
    Label1.Caption := PAnsiChar((MessageData.CopyDataStruct.lpData));
    MessageData.Result := 1;
  end
  else
    MessageData.Result := 0;
end;
end.

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

Цитата:
FindWindow(nil, 'StringReceiver')
Ты уверен что она возвращает правильный хендл?
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  CDS: TCopyDataStruct; h:HWND;
begin
  //Устанавливаем тип команды
  CDS.dwData := CMD_SETLABELTEXT;
  //Устанавливаем длину передаваемых данных
  CDS.cbData := Length(StringEdit.Text) + 1;
  //Выделяем память буфера для передачи данных
  GetMem(CDS.lpData, CDS.cbData);
  try
    //Копируем данные в буфер
    StrPCopy(CDS.lpData, AnsiString(StringEdit.Text));
    //Отсылаем сообщение в окно с заголовком StringReceiver
    h:=FindWindow(nil, 'StringReceiver');
    if IsWindow(h) then begin
      if not SendMessage(h, WM_COPYDATA, Handle, Integer(@CDS)) 
      then RaiseLastOSError;
    end else ShowMessage('Хендл не найден');
  finally
    //Высвобождаем буфер
    FreeMem(CDS.lpData, CDS.cbData);
  end;
end;
И теперь анализируй ошибки если они будут.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.08.2013, 09:44   #3
crazygoldbullet
 
Регистрация: 24.02.2013
Сообщений: 7
По умолчанию

Stilet, проблема была в приёмнике, а не в отправителе... Не происходил вызов WMCopyData...
Мне помогли решить эту проблему, так что тему можно закрыть
crazygoldbullet вне форума Ответить с цитированием
Старый 08.08.2013, 11:53   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ок. Но все равно я бы проверками не гнушался. На опыте почувствовал необходимость.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Народ не получается с задачей в c++! Ни как не получается даже начать! дайте решение,хотя бы набросайте чего нибудь! sonat Помощь студентам 2 30.05.2012 08:27
Не получается принять TCP/IP пакет более 2048 байт. Visual C++ Gvaler C/C++ Сетевое программирование 3 28.09.2011 23:00
Принять файл casper0094 Работа с сетью в Delphi 1 05.12.2010 19:43
Не получается отправить сообщение на сервер zver777 Работа с сетью в Delphi 8 26.10.2009 22:42
Как принять сообщение (SendMessage) Crazyman Win Api 4 20.02.2008 04:42