Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets > QT и WinAPI |
Автор: Энтик 25.09.07, 14:15 |
Собственно у меня один простой вопрос, совместим ли QT с WinAPI? Просто при компиляции строки типа: GetModuleHandle(_T("ntdll.dll")); Получаем ошибку типа: cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR' Немного помучившись я пришел к выводу что дело в несовместимости строк генерируемых QT и строк используемых в WinAPI. Так соместимы ли они и если да то как исправить ошибку? |
Автор: ViGOur 25.09.07, 14:39 |
А ты попробуй так: GetModuleHandle( L("ntdll.dll")); Вообще совместимо, но при не грамотном использовании WinApi в Qt теряется кроссплатформенность. |
Автор: Энтик 25.09.07, 14:57 |
А функция L() если не секрет откуда? |
Автор: neooleg 01.10.07, 16:58 |
Эта не фун-я, а т.с. "определитель" (пусть поправят знатоки С++, незнаю как правильно называется ). Цитата ViGOur А вот так неполучается! Нужно: ты попробуй так: GetModuleHandle( L("ntdll.dll")); <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Или я делаю так: GetModuleHandle( L"ntdll.dll" ); <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> GetModuleHandle( TEXT("ntdll.dll") ); Цитата Энтик Это здесь не причем, хотя, я честно говоря, в Qt мало разбираюсь, но у меня два указанных мной (простите за тафтологию) варианта скомпилились и собрались на ура. Твоя проблема в том, что проект в Unicode, а юзаешь ты ANSI - строку. Вот и все. Делай как я показал и все будет нормально.Немного помучившись я пришел к выводу что дело в несовместимости строк генерируемых QT и строк используемых в WinAPI. З.Ы. И незабудь <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include <Windows.h> |
Автор: Энтик 01.10.07, 19:26 |
О! Огромное спасибо за разъяснение вопролса со строками, как говорится все гениальное просто) Вопрос закрыт. |
Автор: ViGOur 03.10.07, 12:47 |
Мне вот только не понятно, зачем ты используешь GetModuleHandle, когда можно использовать: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> QLibrary myLib("user32"); typedef int (*MessageBox)( int hWnd, QString lpText, QString lpCaption, unsigned int uType); MessageBox myFunction = (MessageBox) myLib.resolve("MessageBoxW"); if( myFunction) myFunction( 0, "text", "caption", 1); |
Автор: Энтик 03.10.07, 16:36 |
Цитата ViGOur @ Мне вот только не понятно, зачем ты используешь GetModuleHandle, когда можно использовать: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> QLibrary myLib("user32"); typedef int (*MessageBox)( int hWnd, QString lpText, QString lpCaption, unsigned int uType); MessageBox myFunction = (MessageBox) myLib.resolve("MessageBoxW"); if( myFunction) myFunction( 0, "text", "caption", 1); А зачем так сложно? тогда уж простым експортом мона. Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа? |
Автор: neooleg 03.10.07, 19:11 |
Цитата Энтик @ Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа? L и TEXT() здесь не катят. Здесь прийдется помучатся с API-шными фун-ями MultiByteToWideChar() и WideCharToMultiByte(). |
Автор: Энтик 03.10.07, 19:46 |
Ну что L здесь не прокатит было сразу ясно, но я так и не понял что за тип TCHAR? И кстати как его в CHAR конвертировать и обратно? (константы и переменные) |
Автор: archimed7592 04.10.07, 10:20 |
AFAICS, в зависимости от того, установлен ли макрос UNICODE - это либо char, либо wchar_t. Аналогично и с _T("str") - это либо L"str", либо просто "str". |
Автор: neooleg 04.10.07, 20:00 |
Цитата Энтик @ Ну что L здесь не прокатит было сразу ясно, но я так и не понял что за тип TCHAR? И кстати как его в CHAR конвертировать и обратно? (константы и переменные) archimed7592 сказал верно, а если ближе к коду, то суть такова: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Т.е. в зависимости от конфигурации проекта используется Unicode или ANSI. #ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif ИМХО: Хороший стить программирования предполагает везде использование TCHAR и макроса TEXT(), на случай если тебе вздумается пересобрать проект Unicode <-> ANSI. З.Ы. Если заметил, API-фун-ии тоже дублированны под ANSI и Unicode, например: CreateWindowA() и CreateWindowW() соответственно ANSI-фун-я и Unicode-фун-я. Принцип "выбора" аналогичный TCHAR через #define. |
Автор: archimed7592 04.10.07, 20:08 |
Цитата neooleg @ Хороший стить программирования предполагает везде использование TCHAR и макроса TEXT(), на случай если тебе вздумается пересобрать проект Unicode <-> ANSI. Не знаю о каком таком гипотетическом случае ты говоришь(в реальной жизни такие случаи бывали ?), но хорошим стилем является как раз таки использование Unicode, без каких-либо предположений о том, что какому-то фанатику приспичит пересобрать проект Unicode <-> ANSI, тем более, если учесть, что в случае с более менее крупным проектом фанатику это не удастся . |
Автор: Flex Ferrum 04.10.07, 20:20 |
Цитата neooleg @ З.Ы. Если заметил, API-фун-ии тоже дублированны под ANSI и Unicode, например: CreateWindowA() и CreateWindowW() соответственно ANSI-фун-я и Unicode-фун-я. Принцип "выбора" аналогичный TCHAR через #define. А вот за это мелкомягким отдельное "спасибо". После этого корректно создать свою собственную функцию (например, в классе) с именем типа CreateFile или ту же CreateWindow уже не получится... |
Автор: archimed7592 04.10.07, 20:24 |
Флекс, только не говори, что выбор нужной версии реализован примитивным макросом... Они чо, совсем тупые? |
Автор: Flex Ferrum 04.10.07, 20:25 |
Цитата Энтик @ Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа? Думаю, что самый близкий к Qt вариант мог бы быть с использованием QString. Добавлено Цитата archimed7592 @ Флекс, только не говори, что выбор нужной версии реализован примитивным макросом... Они чо, совсем тупые? Именно примитивным макросом, и никак иначе... |
Автор: archimed7592 04.10.07, 20:32 |
Угу... Ща посмотрел хэдеры... Что же помешало сделать им inline-forward'еры? Или ещё более мудро: биндить имя без постфикса на одну из версий библиотечных ф-ций? Слава Б-гу, я никогда не использовал мелкомягких хэдеров . |
Автор: Энтик 05.10.07, 02:52 |
Всем спасибо за помощь, не люблю я все таки вещи типа QT, .NET и тп. Куда лучше старый добрый асм и С--) |