Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SendStructMessage x64

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите есть ли какие нибудь оговорки (ограничения) при обмене структурированными сообщениями в х64 проекте (Delphi XE8). Дело в том что код представленный ниже в х86 варианте работает замечательно, а в х64 выдает AV, т.к. на вход обработчика сообщения приходит пустая структура.
 

Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
const
  WM_CHANGE_STATE = WM_USER + 1;
 
type
 CRecord = packed record
   iRecord,
   iObject,
   iState : Integer;
 end;
 
 TCurrRecord = packed record
   Msg    : Cardinal;
   WParam : Integer;
   LParam : ^CRecord;
   Result : LRESULT;
 end;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure WMState(var Msg: TCurrRecord); message WM_CHANGE_STATE;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 WP: WPARAM;
 LP: CRecord;
begin
 WP := 0;
 LP.iRecord := StrToInt(Edit1.Text);
 LP.iObject := StrToInt(Edit3.Text);
 LP.iState  := StrToInt(Edit5.Text);
 SendStructMessage(Application.MainFormHandle,WM_CHANGE_STATE, WP, LP);
end;
 
procedure TForm1.WMState(var Msg: TCurrRecord);
begin
 Edit2.Text := IntToStr(Msg.LParam^.iRecord);
 Edit4.Text := IntToStr(Msg.LParam^.iObject);
 Edit6.Text := IntToStr(Msg.LParam^.iState);
end;
 
end.

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 08:51 14-06-2016
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe
Не верно описана структура. Надо вот так:

Код:
 
TCurrRecord = packed record
     Msg    : NativeInt;
     WParam : WPARAM;
     LParam : ^CRecord;
     Result : LRESULT;
end;
 

Всего записей: 1477 | Зарегистр. 24-03-2009 | Отправлено: 12:18 15-06-2016
AnViSe



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuPriTo
Спасибо, все работает.
з.ы.
Делал по примеру из хелпа где структуры описаны как:

Код:
  MStruct = packed record
    m_a : Integer;
    m_b : Integer;
  end;
 
  TMyStruct = packed record
    Msg : Cardinal;
    WParam : Integer;
    LParam : ^MStruct;
    Result : LRESULT;
  end;

Всего записей: 123 | Зарегистр. 10-11-2008 | Отправлено: 13:40 15-06-2016
SuPriTo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AnViSe
Логично, что в 64 бит. режиме должен быть другой размер элементов структур.
Вероятно пример не использовался в 64 бит.

Всего записей: 1477 | Зарегистр. 24-03-2009 | Отправлено: 16:29 15-06-2016 | Исправлено: SuPriTo, 16:29 15-06-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SendStructMessage x64


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru