Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.10.137] |
|
Сообщ.
#1
,
|
|
|
Собственно у меня один простой вопрос, совместим ли QT с WinAPI?
Просто при компиляции строки типа: GetModuleHandle(_T("ntdll.dll")); Получаем ошибку типа: cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR' Немного помучившись я пришел к выводу что дело в несовместимости строк генерируемых QT и строк используемых в WinAPI. Так соместимы ли они и если да то как исправить ошибку? |
Сообщ.
#2
,
|
|
|
Цитата Энтик @ А ты попробуй так: GetModuleHandle( L("ntdll.dll"));Получаем ошибку типа: cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR' Вообще совместимо, но при не грамотном использовании WinApi в Qt теряется кроссплатформенность. |
Сообщ.
#3
,
|
|
|
А функция L() если не секрет откуда?
|
Сообщ.
#4
,
|
|
|
Цитата Энтик @ А функция L() если не секрет откуда? Эта не фун-я, а т.с. "определитель" (пусть поправят знатоки С++, незнаю как правильно называется ). Цитата ViGOur А вот так неполучается! Нужно: ты попробуй так: GetModuleHandle( L("ntdll.dll")); GetModuleHandle( L"ntdll.dll" ); GetModuleHandle( TEXT("ntdll.dll") ); Цитата Энтик Это здесь не причем, хотя, я честно говоря, в Qt мало разбираюсь, но у меня два указанных мной (простите за тафтологию) варианта скомпилились и собрались на ура. Твоя проблема в том, что проект в Unicode, а юзаешь ты ANSI - строку. Вот и все. Делай как я показал и все будет нормально.Немного помучившись я пришел к выводу что дело в несовместимости строк генерируемых QT и строк используемых в WinAPI. З.Ы. И незабудь #include <Windows.h> |
Сообщ.
#5
,
|
|
|
О! Огромное спасибо за разъяснение вопролса со строками, как говорится все гениальное просто) Вопрос закрыт.
|
Сообщ.
#6
,
|
|
|
Мне вот только не понятно, зачем ты используешь GetModuleHandle, когда можно использовать:
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); |
Сообщ.
#7
,
|
|
|
Цитата ViGOur @ Мне вот только не понятно, зачем ты используешь GetModuleHandle, когда можно использовать: 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 использовать если строка не константа а переменная чаровского типа? |
Сообщ.
#8
,
|
|
|
Цитата Энтик @ Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа? L и TEXT() здесь не катят. Здесь прийдется помучатся с API-шными фун-ями MultiByteToWideChar() и WideCharToMultiByte(). |
Сообщ.
#9
,
|
|
|
Ну что L здесь не прокатит было сразу ясно, но я так и не понял что за тип TCHAR? И кстати как его в CHAR конвертировать и обратно? (константы и переменные)
|
Сообщ.
#10
,
|
|
|
Цитата Энтик @ TCHAR AFAICS, в зависимости от того, установлен ли макрос UNICODE - это либо char, либо wchar_t. Аналогично и с _T("str") - это либо L"str", либо просто "str". |
Сообщ.
#11
,
|
|
|
Цитата Энтик @ Ну что L здесь не прокатит было сразу ясно, но я так и не понял что за тип TCHAR? И кстати как его в CHAR конвертировать и обратно? (константы и переменные) archimed7592 сказал верно, а если ближе к коду, то суть такова: #ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif ИМХО: Хороший стить программирования предполагает везде использование TCHAR и макроса TEXT(), на случай если тебе вздумается пересобрать проект Unicode <-> ANSI. З.Ы. Если заметил, API-фун-ии тоже дублированны под ANSI и Unicode, например: CreateWindowA() и CreateWindowW() соответственно ANSI-фун-я и Unicode-фун-я. Принцип "выбора" аналогичный TCHAR через #define. |
Сообщ.
#12
,
|
|
|
Цитата neooleg @ Хороший стить программирования предполагает везде использование TCHAR и макроса TEXT(), на случай если тебе вздумается пересобрать проект Unicode <-> ANSI. Не знаю о каком таком гипотетическом случае ты говоришь(в реальной жизни такие случаи бывали ?), но хорошим стилем является как раз таки использование Unicode, без каких-либо предположений о том, что какому-то фанатику приспичит пересобрать проект Unicode <-> ANSI, тем более, если учесть, что в случае с более менее крупным проектом фанатику это не удастся . |
Сообщ.
#13
,
|
|
|
Цитата neooleg @ З.Ы. Если заметил, API-фун-ии тоже дублированны под ANSI и Unicode, например: CreateWindowA() и CreateWindowW() соответственно ANSI-фун-я и Unicode-фун-я. Принцип "выбора" аналогичный TCHAR через #define. А вот за это мелкомягким отдельное "спасибо". После этого корректно создать свою собственную функцию (например, в классе) с именем типа CreateFile или ту же CreateWindow уже не получится... |
Сообщ.
#14
,
|
|
|
Флекс, только не говори, что выбор нужной версии реализован примитивным макросом... Они чо, совсем тупые?
|
Сообщ.
#15
,
|
|
|
Цитата Энтик @ Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа? Думаю, что самый близкий к Qt вариант мог бы быть с использованием QString. Добавлено Цитата archimed7592 @ Флекс, только не говори, что выбор нужной версии реализован примитивным макросом... Они чо, совсем тупые? Именно примитивным макросом, и никак иначе... |
Сообщ.
#16
,
|
|
|
Цитата Flex Ferrum @ Именно примитивным макросом, и никак иначе... Угу... Ща посмотрел хэдеры... Что же помешало сделать им inline-forward'еры? Или ещё более мудро: биндить имя без постфикса на одну из версий библиотечных ф-ций? Слава Б-гу, я никогда не использовал мелкомягких хэдеров . |
Сообщ.
#17
,
|
|
|
Всем спасибо за помощь, не люблю я все таки вещи типа QT, .NET и тп. Куда лучше старый добрый асм и С--)
|