Winapi

Тема в разделе "MS Visual C++", создана пользователем o4en1 krutoi, 24 ноя 2008.

Наш партнер Genesis Hackspace
  1. o4en1 krutoi

    o4en1 krutoi Гость

    прочитал книгу создал проект скопировал текст
    #include <windows.h>

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK);
    return 0;
    }
    получается вот такая ошибка
    d:\my progs\hello\hello\hellofrommsgbox.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [20]' to 'LPCWSTR'

    вчем дело
     
  2. MaXXX

    MaXXX New Member

    Регистрация:
    26 мар 2008
    Сообщения:
    1
    Симпатии:
    0
    Книги в основном написаны для старых версий Visual C++, сделай то же самое в 6 версии и все получится )) Или используй функцию MessageBoxA вместо MessageBox.
     
  3. @LE}{@NDER

    @LE}{@NDER Гость

    Тут всего навсего достаточно использовать макрос _T или _TEXT. Назначение этих макросов, грубо говоря, - в зависимости от макроса UNICODE делать ASCII или юникодные строки.

    Пояснение можно найти у Рихтера:
    TCHAR *szError = L"Error";
    Заглавная буква L перед строковым литералом указывает компилятору, что его надо обрабатывать как Unicode-строку. Тогда, размещая строку в области данных программы, компилятор вставит между всеми символами нулевые байты. Но возникает другая проблема — программа компилируется, только если _UNICODE определен. Следовательно, нужен макрос, способный избирательно ставить L перед строковым литералом. Эту работу выполняет макрос _TEXT (или _Т), также содержащийся в Tchar.h. Если _UNICODE определен, _TEXT определяется как: #define _TEXT(x) L ## x В ином случае _TEXT определяется следующим образом: #define _TEXT(x) x


    Этот код будет работать:
    Код (Text):
    #include <windows.h>

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    MessageBox(NULL, _T("Hello, Win32 world!"), _T("Hello from Message Box"), MB_OK);
    return 0;
    }
     
  4. Гость

    Можно еще так замутить:
    CHAR lp1[30]="Hello, Win32 world!\0";
    CHAR lp2[30]="Hello from Message Box\0";
    MessageBox(NULL, lp1, lp2, MB_OK);
     
  5. @LE}{@NDER

    @LE}{@NDER Гость

    Последствия возможны, если в один прекрасный день придется перевести прогу для работы в юникоде, напаришься до посинения. :)
     
  6. misterio

    misterio Гость

    Тогда встречный вопрос : в компиляторе VC++ 2008 Express Edition

    Прекрасно компилируется независимо от символов - русские/английские.
    А вот на это :

    Код (Text):
    #include <windows.h>

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    MessageBox(NULL, _T("Hello, Win32 world!"), _T("Hello from Message Box"), MB_OK);
    return 0;
    }
    Ругаеться, мол error C3861: '_T': identifier not found. Почему? И как научить понимать компилятор?

    -----------------------
    А..всё я разобрался!
     
  7. @LE}{@NDER

    @LE}{@NDER Гость

    Ответ на вопрос уже прозвучал - читать внимательно надо.
    Другими словами, скорее всего в настройках проекта был отключен юникод, соответственно и макрос TEXT не определен. Чудес не бывает, для каждого следствия есть причина, даже если она не очевидна.
     
Загрузка...
Похожие Темы - Winapi
  1. bestguru
    Ответов:
    0
    Просмотров:
    971
  2. DreamForse
    Ответов:
    0
    Просмотров:
    2.520
  3. Vadik(R)
    Ответов:
    1
    Просмотров:
    1.724
  4. Vadik(R)
    Ответов:
    1
    Просмотров:
    1.690
  5. alekssgor
    Ответов:
    0
    Просмотров:
    1.952

Поделиться этой страницей