Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» SendStructMessage x64

Автор: AnViSe
Дата сообщения: 14.06.2016 08:51
Подскажите есть ли какие нибудь оговорки (ограничения) при обмене структурированными сообщениями в х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.
Автор: SuPriTo
Дата сообщения: 15.06.2016 12:18
AnViSe
Не верно описана структура. Надо вот так:

Код:
TCurrRecord = packed record
Msg : NativeInt;
WParam : WPARAM;
LParam : ^CRecord;
Result : LRESULT;
end;
Автор: AnViSe
Дата сообщения: 15.06.2016 13:40
SuPriTo
Спасибо, все работает.
з.ы.
Делал по примеру из хелпа где структуры описаны как:

Код: MStruct = packed record
m_a : Integer;
m_b : Integer;
end;

TMyStruct = packed record
Msg : Cardinal;
WParam : Integer;
LParam : ^MStruct;
Result : LRESULT;
end;
Автор: SuPriTo
Дата сообщения: 15.06.2016 16:29
AnViSe
Логично, что в 64 бит. режиме должен быть другой размер элементов структур.
Вероятно пример не использовался в 64 бит.

Страницы: 1

Предыдущая тема: Сортировка массива C++


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.