![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MessageBox() and ShowMessage() - some troubles или
Fellomena © (2002-02-12 16:10:00)Есть 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));
И всё прекрасно заработало.
Кто объяснит в чём фокус ?
Fellomena (2002-02-13 10:38:00) [1]2 Виктор Щербаков, PVOzerski:
Спасибо за совет, вот уж не думала, что так хитро =)
2 Raptor: что MessageBox виндовая ф-ия знаю, поэтому и стараюсь всегда её использовать (не надо Dialogs подключать 8)
И про то что string это указатель, и соответственно PChar(String()) - не что иное, как преобразование типов указателей тоже вроде знала...
да вот ведь... не обратила внимание на то что param то у меня longing - отсюда и проблема .
Всем спасибочки !
Raptor (2002-02-12 22:44:00) [2]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);
...............
PVOzerski (2002-02-12 17:20:00) [3]Не надо таким способом преобразовывать char в pchar: на выходе - переосмысление значения как
адреса, а не указатель на массив символов. Надо делать так:
MessageBox(0, pchar(string(chr(w))), "111",0);
Виктор Щербаков (2002-02-12 17:06:00) [4]Это связано с преобразованием типов.
Судя по сгенерированному компилятором коду, Char - трактуется как целое, и преобразуется к указателю PChar тоже как целое.
А решение такое:
MessageBox(0, PChar(String(Chr(150))), "Message from DLL", mb_Ok);