Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Энтик @
Получаем ошибку типа:
cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR'
А ты попробуй так: GetModuleHandle( L("ntdll.dll"));

Вообще совместимо, но при не грамотном использовании WinApi в Qt теряется кроссплатформенность. :)

Автор: Энтик 25.09.07, 14:57
А функция L() если не секрет откуда?

Автор: neooleg 01.10.07, 16:58
Цитата Энтик @
А функция L() если не секрет откуда?

Эта не фун-я, а т.с. "определитель" (пусть поправят знатоки С++, незнаю как правильно называется :yes-sad: ).
Цитата 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 и строк используемых в WinAPI.
Это здесь не причем, хотя, я честно говоря, в Qt мало разбираюсь, но у меня два указанных мной (простите за тафтологию) варианта скомпилились и собрались на ура. Твоя проблема в том, что проект в Unicode, а юзаешь ты ANSI - строку. Вот и все. :yes: Делай как я показал и все будет нормально.
З.Ы. И незабудь
<{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
Цитата Энтик @
TCHAR

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}>
    #ifdef UNICODE
    typedef wchar_t TCHAR;
    #else
    typedef char TCHAR;
    #endif
Т.е. в зависимости от конфигурации проекта используется Unicode или ANSI.
ИМХО:
Хороший стить программирования предполагает везде использование TCHAR и макроса TEXT(), на случай если тебе вздумается пересобрать проект Unicode <-> ANSI. ;)
З.Ы. Если заметил, API-фун-ии тоже дублированны под ANSI и Unicode, например: CreateWindowA() и CreateWindowW() соответственно ANSI-фун-я и Unicode-фун-я. Принцип "выбора" аналогичный TCHAR через #define. :yes:

Автор: 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
Цитата Flex Ferrum @
Именно примитивным макросом, и никак иначе... :)

Угу... Ща посмотрел хэдеры... :lool: :lol:
Что же помешало сделать им inline-forward'еры? Или ещё более мудро: биндить имя без постфикса на одну из версий библиотечных ф-ций? :huh:

Слава Б-гу, я никогда не использовал мелкомягких хэдеров :rolleyes:.

Автор: Энтик 05.10.07, 02:52
Всем спасибо за помощь, не люблю я все таки вещи типа QT, .NET и тп. Куда лучше старый добрый асм и С--)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)