Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-56433
Layner
2003-10-29 13:47
2003.11.17
Как в EhDbGrid добавить поле, данные которого берутся из др. табл


9-56429
Арм
2003-05-09 01:54
2003.11.17
Поиск кратчайшего пути....


3-56519
Шурик Ш
2003-10-27 17:38
2003.11.17
А чем тип numeric отличается от decimal?


1-56616
_Agent_
2003-11-05 18:15
2003.11.17
Вопрос по Thread, мож кто прояснит в чём дело...(3)


14-56812
Nick-From
2003-10-24 17:52
2003.11.17
FastReport для Delphi 7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский