Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужна помощь с программой из книги Румянцева 
V
    Опции темы
limelight
Дата 18.4.2010, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 19.10.2009

Репутация: нет
Всего: нет




 Пытаюсь скомпилировать самый первый пример из книги Румянцева "Азбука WinAPI" и у меня возникают ошибки. Собственными силами уменьшил их количестко с 8-ми до 2-х))) - отключил юникод.
Как дальше быть не знаю. нужна помощь...
Код:

Код

#include <windows.h>

LRESULT CALLBACK HelloWorldWndProc(HWND, UINT, UINT, LONG);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpszCmdParam, int nCmdShow)
{
    HWND hWnd;
    WNDCLASS WndClass;
    MSG Msg;
    char szClassName[]="HelloWorld";

    WndClass.style = CS_HREDRAW|CS_VREDRAW;
    WndClass.lpfnWndProc = HelloWorldWndProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbClsExtra = 0;
    WndClass.hInstance = hInstance;
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = szClassName;

    if (!RegisterClass(&WndClass))
    {
        MessageBox(NULL, "Cannot register class", "Error", MB_OK);
        return 0;
    }

    hWnd = CreateWindow(szClassName, "Program №о 1",
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL,
                        hInstance, NULL);
    if (!hWnd)
    {
        MessageBox(NULL,"Cannot create window", "Error", MB_OK);
        return 0;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&Msg, NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

LRESULT CALLBACK HelloWorldWndProc (HWND hWnd, UINT Message,
                                    UINT wParam, LONG lParam)
{
    HDC hDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    switch(Message)
    {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &PaintStruct);
        GetClientRect(hWnd, &Rect);
        DrawText(hDC, "Hello World!", 1, &Rect,
            DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hWnd, &PaintStruct);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, Message, wParam, lParam);
}


Ошибки:
------ Build started: Project: my_windows_program, Configuration: Debug Win32 ------
Linking...
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
D:\\my_windows_program\Debug\my_windows_program.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://d:\\my_windows_program\my_windows_program\Debug\BuildLog.htm"
my_windows_program - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
PM MAIL ICQ   Вверх
xvr
Дата 18.4.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Это одна ошибка - у вас неправильный тип проекта. Нужно 'Приложение Win32', а у вас 'Консольное приложение Win32'

PM MAIL   Вверх
limelight
Дата 18.4.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 19.10.2009

Репутация: нет
Всего: нет



Спасибо!
Выполнить получилось, но теперь выходит не то окно которое должно. а именно - выходит окно с надписью "Cannot register class". В чем может быть дело?
PM MAIL ICQ   Вверх
GoldFinch
Дата 18.4.2010, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



limelight, посмотрите код ошибки, который возвращает GetLastError()
PM MAIL ICQ   Вверх
limelight
Дата 18.4.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 19.10.2009

Репутация: нет
Всего: нет



А это здесь причем? У меня ведь нет такой функции??
PM MAIL ICQ   Вверх
xvr
Дата 19.4.2010, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(limelight @  18.4.2010,  23:53 Найти цитируемый пост)
У меня ведь нет такой функции?? 
Есть. В строке 23


PM MAIL   Вверх
GoldFinch
Дата 19.4.2010, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



limelight, GetLastError возвращает код ошибки последней вызванной функции

но удобнее писать примерно так
Код

    if(!RegisterClass(&WndClass))
    {
        LPWSTR pszMsgBuf;
        FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),NULL,(LPWSTR)&pszMsgBuf,0,NULL);
        MessageBoxW(0,pszMsgBuf,0,0);

        return 0;
    }


Добавлено через 3 минуты и 27 секунд
или так...
Код

void system_error(const wchar_t* caption)
{
    /*    Выводит MessageBox с текстом последней системной ошибки (GetLastError)
     */
    const int BUF_SIZE = 1024;
    wchar_t errorMsgBuf[BUF_SIZE];
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM + FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL, GetLastError(), NULL, errorMsgBuf, BUF_SIZE, NULL);
    MessageBoxW(0, errorMsgBuf, caption, 0);
}

..........................

    if (!RegisterClass(&WndClass))
    {
        system_error(L"Cannot register class");
        return 0;
    }

PM MAIL ICQ   Вверх
limelight
Дата 19.4.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 19.10.2009

Репутация: нет
Всего: нет



GoldFinch,  спасибо!!!
У меня пока нет постов чтобы вам плюс поставить( 

Я взял предложенный вами код:
Код

if(!RegisterClass(&WndClass))
    {
        LPWSTR pszMsgBuf;
        FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),NULL,(LPWSTR)&pszMsgBuf,0,NULL);
        MessageBoxW(0,pszMsgBuf,0,0);

        return 0;
    }


В результате чего появилось окошко  с ошибкой : "неправильно задан параметр". 
Ну и я сразу подумал что при наборе текста ошибся в параметрах структуры WndClass!
Как оказалось, действительно ошибся, не тот параметр указал)
Мое первое окошко заработало  smile  Ура)
PM MAIL ICQ   Вверх
xvr
Дата 19.4.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(limelight @  19.4.2010,  12:51 Найти цитируемый пост)
У меня пока нет постов чтобы вам плюс поставить( 
Это дело поправимое  smile Поставил +

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1945 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.