Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.04.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
3-46244
kserg@ukr.net
2002-03-25 11:37
2002.04.15
Как выполнить поиск 1-го вхождения и последующих без фильтрации?


1-46389
Kate
2002-04-02 12:30
2002.04.15
Поиск файлов


1-46368
Andrey007
2002-04-02 21:39
2002.04.15
Как активизировать минимизированную форму при закрытии другой?


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


3-46280
Roman_tutov@mail.ru
2002-03-26 11:02
2002.04.15
Добавление новых записей в DBGrid