Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];

Вниз

MessageBox() and ShowMessage() - some troubles или   Найти похожие ветки 

 
Fellomena   (2002-02-12 16:10) [0]

Есть DLL, в которой есть callback function. Одним из параметров этой ф-ии является параметр с типом longint который содержит виртуальный код клавиши.
В DLL я использовала:

uses
Windows, Forms;

И, соответственно, пыталась вывести значение клавиши по virtual коду следующим образом:
MessageBox(0, PChar(Chr(param)), "Message from DLL", 0);
где param содержит код клавиши.
Ничего не получалось, вернее вообще никакого сообщения не выводилось !!!
Тогда я добавила в uses:

uses
Windows, Forms, Dialogs;

И в том же месте сделала:

ShowMessage(Chr(param));

И всё прекрасно заработало.

Кто объяснит в чём фокус ?


 
Виктор Щербаков   (2002-02-12 17:06) [1]

Это связано с преобразованием типов.
Судя по сгенерированному компилятором коду, Char - трактуется как целое, и преобразуется к указателю PChar тоже как целое.

А решение такое:
MessageBox(0, PChar(String(Chr(150))), "Message from DLL", mb_Ok);


 
PVOzerski   (2002-02-12 17:20) [2]

Не надо таким способом преобразовывать char в pchar: на выходе - переосмысление значения как
адреса, а не указатель на массив символов. Надо делать так:

MessageBox(0, pchar(string(chr(w))), "111",0);



 
Raptor   (2002-02-12 22:44) [3]

2 Fellomena
Функция ShowMessage - это делфийская функция и потому она будет корректно работать при подстановке вместо строки String символа Char. Функция же MessageBox - виндовая. Ей нужно корректно задать в качестве строкового параметра строку, заканчивающуюся нулем. А при приведении Char к PChar не получится такая строка, так как пременная типа String есть ничто иное как указатель, а Char это статический тип.
То, что сообщения никакие не выводились, не означает, что ошибок не было. Если попробуешь этот же код:
MessageBox(0, PChar(Chr(param)), "Message from DLL", 0);
запустить в проекте из под делфы, сразу же получишь ошибку от user32.dll.
Посему надо сделать так, как указывали выше, или так (что то же самое):

Var
s:String;
...............
s:=Chr(param);
MessageBox(0, PChar(s), "Message from DLL", 0);
...............



 
Fellomena   (2002-02-13 10:38) [4]

2 Виктор Щербаков, PVOzerski:

Спасибо за совет, вот уж не думала, что так хитро =)

2 Raptor: что MessageBox виндовая ф-ия знаю, поэтому и стараюсь всегда её использовать (не надо Dialogs подключать 8)
И про то что string это указатель, и соответственно PChar(String()) - не что иное, как преобразование типов указателей тоже вроде знала...
да вот ведь... не обратила внимание на то что param то у меня longing - отсюда и проблема .

Всем спасибочки !



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.005 c
7-46524
SAlex
2002-01-23 05:13
2002.04.15
Как определить возможные размеры шрифтов в системе


14-46504
Blackweber
2002-03-07 00:32
2002.04.15
Военмех


3-46277
Vip_Guest
2002-03-20 16:15
2002.04.15
Смена запроса SQL


1-46352
Gass
2002-04-03 16:14
2002.04.15
PropertyEditor в Delphi 6


14-46494
--Reporter--
2002-03-06 13:50
2002.04.15
Проблема с рускими буквами в WinAmp 2.5 :-(





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский