На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: archimed7592
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> QT и WinAPI , Вопрос о совместимости
    Собственно у меня один простой вопрос, совместим ли QT с WinAPI?
    Просто при компиляции строки типа:
    GetModuleHandle(_T("ntdll.dll"));
    Получаем ошибку типа:
    cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR'

    Немного помучившись я пришел к выводу что дело в несовместимости строк генерируемых QT и строк используемых в WinAPI. Так соместимы ли они и если да то как исправить ошибку?
      Цитата Энтик @
      Получаем ошибку типа:
      cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR'
      А ты попробуй так: GetModuleHandle( L("ntdll.dll"));

      Вообще совместимо, но при не грамотном использовании WinApi в Qt теряется кроссплатформенность. :)
        А функция L() если не секрет откуда?
          Цитата Энтик @
          А функция L() если не секрет откуда?

          Эта не фун-я, а т.с. "определитель" (пусть поправят знатоки С++, незнаю как правильно называется :yes-sad: ).
          Цитата ViGOur
          ты попробуй так: GetModuleHandle( L("ntdll.dll"));
          А вот так неполучается! Нужно:
          ExpandedWrap disabled
            GetModuleHandle( L"ntdll.dll" );
          Или я делаю так:
          ExpandedWrap disabled
            GetModuleHandle( TEXT("ntdll.dll") );
          Цитата Энтик
          Немного помучившись я пришел к выводу что дело в несовместимости строк генерируемых QT и строк используемых в WinAPI.
          Это здесь не причем, хотя, я честно говоря, в Qt мало разбираюсь, но у меня два указанных мной (простите за тафтологию) варианта скомпилились и собрались на ура. Твоя проблема в том, что проект в Unicode, а юзаешь ты ANSI - строку. Вот и все. :yes: Делай как я показал и все будет нормально.
          З.Ы. И незабудь
          ExpandedWrap disabled
            #include <Windows.h>
          ;)
          Сообщение отредактировано: neooleg -
            О! Огромное спасибо за разъяснение вопролса со строками, как говорится все гениальное просто) Вопрос закрыт.
              Мне вот только не понятно, зачем ты используешь GetModuleHandle, когда можно использовать:
              ExpandedWrap disabled
                    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);
                Цитата ViGOur @
                Мне вот только не понятно, зачем ты используешь GetModuleHandle, когда можно использовать:
                ExpandedWrap disabled
                      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 использовать если строка не константа а переменная чаровского типа?
                  Цитата Энтик @
                  Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа?

                  L и TEXT() здесь не катят. Здесь прийдется помучатся с API-шными фун-ями MultiByteToWideChar() и WideCharToMultiByte().
                    Ну что L здесь не прокатит было сразу ясно, но я так и не понял что за тип TCHAR? И кстати как его в CHAR конвертировать и обратно? (константы и переменные)
                      Цитата Энтик @
                      TCHAR

                      AFAICS, в зависимости от того, установлен ли макрос UNICODE - это либо char, либо wchar_t.
                      Аналогично и с _T("str") - это либо L"str", либо просто "str".
                        Цитата Энтик @
                        Ну что L здесь не прокатит было сразу ясно, но я так и не понял что за тип TCHAR? И кстати как его в CHAR конвертировать и обратно? (константы и переменные)

                        archimed7592 сказал верно, а если ближе к коду, то суть такова:
                        ExpandedWrap disabled
                          #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:
                          Цитата neooleg @
                          Хороший стить программирования предполагает везде использование TCHAR и макроса TEXT(), на случай если тебе вздумается пересобрать проект Unicode <-> ANSI. ;)

                          Не знаю о каком таком гипотетическом случае ты говоришь(в реальной жизни такие случаи бывали :)?), но хорошим стилем является как раз таки использование Unicode, без каких-либо предположений о том, что какому-то фанатику приспичит пересобрать проект Unicode <-> ANSI, тем более, если учесть, что в случае с более менее крупным проектом фанатику это не удастся :).
                            Цитата neooleg @
                            З.Ы. Если заметил, API-фун-ии тоже дублированны под ANSI и Unicode, например: CreateWindowA() и CreateWindowW() соответственно ANSI-фун-я и Unicode-фун-я. Принцип "выбора" аналогичный TCHAR через #define.

                            А вот за это мелкомягким отдельное "спасибо". После этого корректно создать свою собственную функцию (например, в классе) с именем типа CreateFile или ту же CreateWindow уже не получится...
                              Флекс, только не говори, что выбор нужной версии реализован примитивным макросом... Они чо, совсем тупые?
                                Цитата Энтик @
                                Тут новый вопрос появился: а как L использовать если строка не константа а переменная чаровского типа?

                                Думаю, что самый близкий к Qt вариант мог бы быть с использованием QString.

                                Добавлено
                                Цитата archimed7592 @
                                Флекс, только не говори, что выбор нужной версии реализован примитивным макросом... Они чо, совсем тупые?

                                Именно примитивным макросом, и никак иначе... :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0465 ]   [ 16 queries used ]   [ Generated: 27.04.24, 21:31 GMT ]