Форум: "Основная";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];
ВнизРабота с указателями в OP - почему так? Найти похожие ветки
← →
Maks Realov (2003-11-05 14:07) [0]Смысл:
мне приходим WinMessage в котором lParam и wParam - это две части одного 64-х битного указателя. Получив этот указатель, я должен проверить, что лежит в первом байте, в зависимости от этого произвести некие операции и дальше кинуть message с теми же параметрами.
...
var
i64Pointer: int64;
...
procedure TMainForm.WMRSTMESSAGE(var Msg: TMessage);
var
temp: PChar;
begin
i64Pointer:= int64(Msg.LParam) or (int64(Msg.WParam) shl 32);
temp:= PChar(i64Pointer);
case temp[0] of
...
end;
...
Всё нормально, но почему, к примеру прочитать второй байт можно (if temp[2] = "1" then ...), а изменить этот байт не могу (temp^[2]:= "1";) - ошибка. Почему? Или я не догоняю, что PChar в Pascal"e значит 8(
← →
mOOx_ (2003-11-05 14:16) [1]хоть бы для приличия нваписал, что за ощибка :)
← →
Плохиш_ (2003-11-05 14:20) [2]>Maks Realov (05.11.03 14:07)
Потому что у тебя нет прав для записи в эту область
← →
Maks Realov (2003-11-05 14:20) [3]AV конечно - если бы определённая была - я бы и не спрашивал :)
← →
Vitaly (2003-11-05 14:28) [4]> (if temp[2] = "1" then ...)
> (temp ^[2]:= "1";)
????????????????
Зачем разименовывать?
← →
Юрий Зотов (2003-11-05 14:32) [5]1. Откуда в D6 и Win32 64-битные указатели и что это означает?
2. PChar в Pascal"e означает то же, что и в Cи - указатель на символ (в D6 - 32-битный). Но компилятор Delphi может разыменовывать их автоматически и поэтому запись temp[2] он трактует, как второй символ ASCIIZ-строки, на начало которой указывает temp, а запись temp^[2] для него - нечто вроде косвенной адресации (temp^^[2]). Вывод - не надо разыменовывать.
← →
icWasya (2003-11-05 14:37) [6]и что такое 64-битный указатель? :-(
← →
Малиновский Владимир (2003-11-05 14:38) [7]Ну, типа, раз нельзя - значить, нельзя.
Вариант решения:
ты нам объясняешь задачу чуть поподробнее (что хочешь получить таким хитрым способом, а мы пробуем придумать, как избежать конфликтной ситуации). Я вот сам создаю некоий объект где-то в памяти:
FrameCommandCortage := TFrameCommandCortage.Create(Tfrb_ActivatedFrameClass(MainFrame));
FrameCommandCortage.FrameCommand := CommandActivateFrame;
SetLength(FrameCommandCortage.A_Params,3); // Три дополнительных параметра
FrameCommandCortage.A_Params[0] := New_Id; // Номер записи - старый
FrameCommandCortage.A_Params[1] := Caption; // Заголовок
FrameCommandCortage.A_Params[2] := ImageIndex; // Картинка
PostMessage(fMain.Handle, UM_ACTIVATEFRAME, integer(FrameCommandCortage), 0)
А потом в обработчике сообщения смотрю, что за объект получен, и обращаюсь к его свойствам и методам - без проблем:
procedure TfMain.OnActivateFrameMessage(var msg: TMessage);
begin
SelectFrame(TFrameCommandCortage(msg.WParam));
end;
...
procedure TfMain.SelectFrame( FrameCommandCortage : TFrameCommandCortage);
...
begin
...
wrkFrame := FrameCommandCortage.FrameReciver;
with TTabSheet.Create(pcMain) do begin
Caption := FrameCommandCortage.A_Params[1] ;
PageControl := pcMain;
ImageIndex := FrameCommandCortage.A_Params[2] ;
end;
wrkFrame := Tfrb_ActivatedFrameClass((wrkFrame).Create(self));
with Tfrb_ActivatedFrame(wrkFrame) do begin
Parent := pcMain.Pages[idxPage];
Align := alClient;
end;
end;
with Tfrb_ActivatedFrame(wrkFrame) do begin
New_Id := FrameCommandCortage.A_Params[0] ;
end;
... и т.д.
Так что поподробнее, поподробнее...
← →
NAlexey (2003-11-05 14:40) [8]>i64Pointer:= int64(Msg.LParam) or (int64(Msg.WParam) shl 32);
Всегда интересно было, почему затягивает в такие дебри. Ладно пусть ошибся с битами, с кем не бывает... Ну есть же LoWord и HiWord, для кого все это делали, трудились в поте своего китайского лица, чтобы ты писал такое?
← →
Anatoly Podgoretsky (2003-11-05 14:41) [9]icWasya © (05.11.03 14:37) [6]
Этот вопрос понятный, но откуда реализация в дельфи, тем более через PChar
← →
Maks Realov (2003-11-05 15:21) [10]Отвечаю сразу всем.
1). В Delphi нет 64-ых указателей. Это так. Но при написаннии того, над чем я работаю некоторые товарищи закладывались на то, что скоро будет 64-х разрядные машины и соотв. адресация.
2). Конечно без разъименования, просто я неправильно присваивал: temp[2]:= "с", что, естественно не прокатывало :) Надо было temp[2]:= #99; 8)
3). И что, что есть LoWord и HiWord? Word - 16 бит. LoWord - 4 бита и HiWord - 4 бита. А мне надо 64 бита...
А что такого в 64-х битном указателе?
Что, в Pascal"e не выходят за границы 32-х бит???
Какие проблемы?
Сейчас, в 32-х битных системах, в wParam нули, потом, если потребудется будет передавать не нуль и всё будет наверняка работать.
← →
Maks Realov (2003-11-05 15:25) [11]2 Anatoly Podgoretsky:
Вам забыл ответить :) Сами мы не месные - ваши делфёвые приколы пока не все понимаем. Один тип указателя к другому, такого же размера не присваивай - нельзя, только явное приведение типов... Короче мне этот Invalid Type Cast уже замучил... Вот я и сделал по-простяцки, как знал: через PChar. Если проще можно - покажите как, буду признателен.
← →
Малиновский Владимир (2003-11-05 15:31) [12]Так есть же нетипизированные указатели!
Ух, сишники!
← →
Anatoly Podgoretsky (2003-11-05 15:32) [13]В итоге ты присвоил младшии 32 бита
← →
Maks Realov (2003-11-05 15:36) [14]2 Малиновский Владимир:
Я не С-ик 8) Я человек, в силу обстоятельств, вынужденный разгребать кучу всякого Г, часть этого Г написанно на С++, часть на Delphi :-(
← →
Maks Realov (2003-11-05 15:41) [15]2 Anatoly Podgoretsky:
Естественно, это и ежу понятно. Я же говорю, что пока wParam всегда 0, так что такое пока прокатывает. Что дальше делать пока не решил... Мне надо, что бы это всё заработало, пусть только под 32-х битные ОС. Dll из которой мне это всё приходит - не я писал, так что "еду" как могу.
← →
Romkin (2003-11-05 15:54) [16]Что-то мне не кажется, что вот так возьмет и заработает на 64 битах :)))
Хочу сказать, не майтесь дурью. lParam, если будет, в 64 битах будет те же 64 бита ;)
← →
Малиновский Владимир (2003-11-05 16:05) [17]Что за переживания, может, под 64 никаких Delphi и не будет...
Говорят же - отпровитель создает объект, в который пихает все, что хочет:
MyObject := TMyObject.Create(Self);
With MyObject do begin
iParam1 := 1;
iParam1 := 2;
sParam1 := "One";
sParam2 := "Two";
end
Потом - пихаем указатель на этот объект в Message
PostMessage(Window.Handle, UM_MYMESSAGE, integer(MyObject), 0);
И все! Все недостающие данные размещаем в свойствах объекта, а в обработчике нагло приводим wParam к типу TMyParam и юзаем его:
procedure OnActivateMYMESSAGE(var msg : TMessage); message
UM_MYMESSAGE;
...
procedure Window.OnActivateMYMESSAGE(var msg: TMessage);
var AgainMyObject : TMyObject;
begin
try
AgainMyObject := TMyObject(msg.WParam);
...
// юзаем его (AgainMyObject) до синевы
...
finally
AgainMyObject.Free
end
end;
Ну и зачем здесь 64 бита?
Что там в 64-битной ОС будет, никто не знает...
Есть подозрение, что тип Integer тоже будет 64 - разрядный...
← →
Maks Realov (2003-11-05 16:12) [18]Ой, ну раз все такие дотошные, то рассказываю всё целиком.
Мне приходит указатель на С-ый union, первым полем которого идёт однобайтовый Char, дальше варианты структур.
Я получаю этот указатель и явно привожу его к типу своего packed record"a (С-ый юнион выровнен по байту), память под который распределяется в точности как под С-ый юнион. Соотв. я первым элементом я имею в своём рекорде тоже Char, в котором после приведения типов и получаю нужное мне значение.
Пример с PChar-ом привёл, что бы не объяснять всё это подробно, думал, что он аналогичен по функуионалу вышесказанному.
Согласен, извращаться с 64-мя битами может и не стоит...
← →
Малиновский Владимир (2003-11-05 16:20) [19]...какой Вы нудный...
← →
Малиновский Владимир (2003-11-05 16:24) [20]Я пошутил.
← →
Ega23 (2003-11-05 16:32) [21]Я слышал следующую вещь: для совместимости кода (частичной, конечно), Borland рекомандует пользоваться типами данных Integer и Cardinal. При изменении разрядности самой OS изменится разрядность и этих типов.
← →
Maks Realov (2003-11-05 16:49) [22]Хотя нет, не согласен: извращение тут вполне уместно!
lParam, wParam - определённые структуры (см. MSDN), а значит их менять не будут. Просто так получилось, что эти типы такого же размера, как и Int. А как вы в 64-х разрядной системе будете передавать указатели в WinMessag"ах? Через один lParam или wParam не удастся!!! А вот моя схема работать будет всегда (пока на 128 разрядов не перейдут :-)
А разрядность Int может и поменяют.
← →
Anatoly Podgoretsky (2003-11-05 16:51) [23]Maks Realov (05.11.03 16:49) [22]
Их уже меняли, почему бы не изменить и при переходе на 64 бита, вероятнее всего изменят
← →
Maks Realov (2003-11-05 17:05) [24]2 Anatoly Podgoretsky:
Меняли? Они (lParam и wParam) были 16-ти битные? При том же механизме Windows Message"ей?
Не знал. Если можно - поподробнее расскажите. Я в то время, наверное, ещё на QBasic"e нажимал :-)
← →
Игорь Шевченко (2003-11-05 17:21) [25]Maks Realov (05.11.03 17:05)
wParam был 16-битный, lParam был 32-х битный
← →
Anatoly Podgoretsky (2003-11-05 17:25) [26]Maks Realov (05.11.03 17:05) [24]
Игорь Шевченко ответил, изменят для совместимости с разрядностью, как изменят не ясно, но наверно оба
← →
Anatoly Podgoretsky (2003-11-05 17:26) [27]Но никакой проблемы с обратной совместимостью не будет, на данный момент спокойно запускаются досовские приложения и приложения Win 3.1, Win32S
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c