Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> НЕ компилится проект на студии 2005 
:(
    Опции темы
Golovastik
Дата 1.10.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 0



Начал читать книгу по API, автор Щупак. 
Во второй программе, этой книги создаётся оконное приложение. Набрал как в книге, проверял всё точь в точь, но программа не компилится, выдаёт ошибку:
Cannot convert from 'char [8] to 'LPCSTR'
Все подробности программы я буду читать в книге,нужн оскомпилить проект,чтоб по нему смотреть.


Код

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    HWND hMainWnd;
char szClassName[] = "MyClass";
   MSG msg;
   WNDCLASSEX wc;
   wc.cbSize         = sizeof(wc);
   wc.style          = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc    = WndProc;
   wc.cbClsExtra     = 0;
   wc.cbWndExtra     = 0;
   wc.hInstance      = hInstance;
   wc.hIcon          = LoadCursor(NULL, IDI_APPLICATION);
   wc.hCursor        = LoadCursor(NULL,IDC_ARROW);
   wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wc.lpszMenuName   = NULL;
   wc.lpszClassName  = szClassName;
   wc.hIconSm        = LoadIcon(Nul, IDI_APPLIACTION);

    //Регистрируем класс окна
   if(!RegisterClassEx(&wc))
   {
       MessageBox(NULL,L"Класс не зарегестрирован",L"Ошибка",MB_ICONQUESTION);
       return 0;
   }
   //Создаёи основное окно приложения   
   hMainWnd = CreateWindow(
       szClassName,"Привет Украина",WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, 0, CW_USEDEFAULT,0, (HWND)NULL, (HMENU)NULL,
       (HINSTANSE)hInstance,NUL);

   if(!hMainWnd)
   {
       MessageBox(NULL,L"Не можно создать основное окно",L"Ошибка",MB_OK);
       return 0;
   }
//Показываем наше окно
   ShowWindow(hMainWnd, nCmdShow);
   UpdateWindow(hMainWnd);

//Выполняем цикл обработки сообщений до закрытия программы
while(GetMessage(&msg,NULL,0,0))  
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    return msg.wParam;
}
//=======================================================================================
LRESULT CALLBACK WindProc(HWND hWnd, UINT uMsg, WParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    switch(uMsg)
    {
    case WM_PAINT: GetClientRect(hWnd, &rect);
                  DeawText(hDC, "Hello, World!", -1,&rect,
                  DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                  EndPaint(hWnd,&s);
                  break;

    case WM_CLOSE:
    DestroyWindow(hWnd); break; 

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
          return DefWindowProc(hWnd,uMsg, wParam, lParam);
    }
    return 0;

    }

}

}





PM MAIL   Вверх
jonie
Дата 1.10.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

char szClassName[] = "MyClass";
замени на
Цитата

const char szClassName[] = "MyClass";



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Golovastik
Дата 1.10.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 0



Странно, но выдаёт тоже самую ошибку.
PM MAIL   Вверх
586
Дата 1.10.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



замени
Цитата(Golovastik @  1.10.2009,  21:33 Найти цитируемый пост)
char szClassName[] = "MyClass";

на
Код
wchar_t szClassName[] = L"MyClass";

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


Опытный
**


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

Репутация: -1
Всего: 0



Спасибо, в некоторых местах также подкоректировал, теперь выдатё на строке:

Код


    return msg.wParam;


ошибку:
c:\documents and settings\admin\рабочий стол\papka\forma_api\forma_api\forma.cpp(51) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



привыкайте писать правильно,
при использовании API, в которых фигурируют строковые параметры, не нужно смешивать разные типы данных,

тут возможно много правильных вариантов, вот только некоторые:
Код

TCHAR szClassName[] = _T("MyClass");
_TCHAR szClassName[] = _T("MyClass");
TCHAR szClassName[] = _TEXT("MyClass");
_TCHAR szClassName[] = _TEXT("MyClass");

при использовании префикса  _T, нужно дополнительно подключать tchar.h, все остальные - из WinNT.h,
т.е. достаточно одного windows.h

если непонятно как работает макрос, можно считать _TCHAR, LPCTSTR, LPTSTR - совершенно несовместимыми с char и wchar_t,
не нужно указывать их в одном контексте!
Цитата(Golovastik @  1.10.2009,  23:22 Найти цитируемый пост)
return msg.wParam;

Код

return (int)msg.wParam;



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Курсант
Дата 1.10.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 338
Регистрация: 21.2.2009
Где: Балашиха или Воро неж

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



Как вариант - вместо CreateWindow и RegisterClassEx  пользоваться реальными функциями, а именно 

CreateWindowA

и 

RegisterClassExA

Тогда все будет работать... ПРоблема в том, что в модуле windows.h, если не ошибаюсь, есть такая тема как 

#usedef CreateWindow CreateWindowW
#usedef RegisterClassEx RegisterClassExW

тобишь вы пытаетесь юникодовские версии функций вызвать с ансишными строками, а это не есть гут, компилятор это выдает ошибкой.
PM ICQ Skype   Вверх
GremlinProg
Дата 1.10.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Курсант @  2.10.2009,  00:22 Найти цитируемый пост)
Как вариант - вместо CreateWindow и RegisterClassEx  пользоваться реальными функциями

да, как вариант, только нужно отдавать себе отчет, что CreateWindowA создает анси-окно, а CreateWindowW - юникод, соответственно, IsWindowUnicode будет возвращать в таких окнах разные значения, отчего может меняться и его поведение

самое безобидное следствие такой ошибки - отсутствие реакции на определенные сообщения, например: при использовании транслятора уведомтения, подобного TVN_GETDISPINFO

хорошо, если окно поддержит оба варианта во всех версиях
если нет - неочевидная ошибка убъет много времени,
прежде чем до нее кто-нибудь доберется, если доберется вообще

поэтому, ради сохранения психологического равновесия, не надо подстраиваться под какую-то частную ситуацию,
дающую выигрыш только в данный момент,
есть общее правило, почему бы ему не следовать


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Golovastik
Дата 1.10.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 0



Когда прописал :
Код


return (int)msg.wParam;


теперь программа стала выдавать ошибку:
c:\documents and settings\admin\рабочий стол\papka\forma_api\forma_api\forma.cpp(55) : error C2061: syntax error : identifier 'WParam'

PM MAIL   Вверх
586
Дата 1.10.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Golovastik @  1.10.2009,  23:58 Найти цитируемый пост)
Когда прописал :
Код
return (int)msg.wParam;


теперь программа стала выдавать ошибку:
c:\documents and settings\admin\рабочий стол\papka\forma_api\forma_api\forma.cpp(55) : error C2061: syntax error : identifier 'WParam'


найди одно отличие:
Код

wParam
WParam


PM   Вверх
GremlinProg
Дата 1.10.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



ну конечно, WParam и wParam - разные идентификаторы,
в коде и скобки неправильно стоят,

вобщем внимательно следи за текстом, Си -  не русский язык, "я люблю" и "люблю я" - можно трактовать по-разному


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Golovastik
Дата 2.10.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 0



Подключил файл #include <winuser.h>
Теперь остановилось на строке:

Код

LRESULT CALLBACK WindProc(HWND hWnd, UINT uMsg, WPARAM, LPARAM lParam)



выдаёт ошибку:
c:\documents and settings\admin\рабочий стол\papka\forma_api\forma_api\forma.cpp(57) : error C2601: 'WindProc' : local function definitions are illegal

Вот подкоректированный код, в последнем варианте:

Код

#include <windows.h>
#include <winuser.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    HWND hMainWnd;
wchar_t szClassName[] = L"MyClass";

   MSG msg;
   WNDCLASSEX wc;
   wc.cbSize         = sizeof(wc);
   wc.style          = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc    = WndProc;
   wc.cbClsExtra     = 0;
   wc.cbWndExtra     = 0;
   wc.hInstance      = hInstance;
   wc.hIcon          = LoadCursor(NULL, IDI_APPLICATION);
   wc.hCursor        = LoadCursor(NULL,IDC_ARROW);
   wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wc.lpszMenuName   = NULL;
   wc.lpszClassName  = szClassName;
   wc.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

    //Регистрируем класс окна
   if(!RegisterClassEx(&wc))
   {
       MessageBox(NULL,L"Класс не зарегестрирован",L"Ошибка",MB_ICONQUESTION);
       return 0;
   }
   //Создаём основное окно приложения   
   hMainWnd = CreateWindow(
       szClassName,L"Привет Украина",WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, 0, CW_USEDEFAULT,0, (HWND)NULL, (HMENU)NULL,
       (HINSTANCE)hInstance,NULL);

   if(!hMainWnd)
   {
       MessageBox(NULL,L"Не можно создать основное окно",L"Ошибка",MB_OK);
       return 0;
   }
//Показываем наше окно
   ShowWindow(hMainWnd, nCmdShow);
   UpdateWindow(hMainWnd);

//Выполняем цикл обработки сообщений до закрытия программы
while(GetMessage(&msg,NULL,0,0))  
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    return (int)msg.wParam;
}
//=======================================================================================
LRESULT CALLBACK WindProc(HWND hWnd, UINT uMsg, WPARAM, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    switch(uMsg)
    {
    case WM_PAINT: GetClientRect(hWnd, &rect);
                  DeawText(hDC, "Hello, World!", -1,&rect,
                  DT_SINGLELINE | DT_CENTER | DT_VCENTER);
                  EndPaint(hWnd,&s);
                  break;

    case WM_CLOSE:
    DestroyWindow(hWnd); break; 

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
          return DefWindowProc(hWnd,uMsg, wParam, lParam);
    }
    return 0;

    }

}

}


PM MAIL   Вверх
586
Дата 2.10.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Неправильно расставлены фигурные скобки (о чём GremlinProg писал).
Код
#include <windows.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    HWND hMainWnd;
    wchar_t szClassName[] = L"MyClass";
   MSG msg;
   WNDCLASSEX wc;
   wc.cbSize         = sizeof(wc);
   wc.style          = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc    = WndProc;
   wc.cbClsExtra     = 0;
   wc.cbWndExtra     = 0;
   wc.hInstance      = hInstance;
   wc.hIcon          = LoadCursor(NULL, IDI_APPLICATION);
   wc.hCursor        = LoadCursor(NULL,IDC_ARROW);
   wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wc.lpszMenuName   = NULL;
   wc.lpszClassName  = szClassName;
   wc.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    //Регистрируем класс окна
   if(!RegisterClassEx(&wc))
   {
       MessageBox(NULL,L"Класс не зарегестрирован",L"Ошибка",MB_ICONQUESTION);
       return 0;
   }
   //Создаём основное окно приложения   
   hMainWnd = CreateWindow(
       szClassName,L"Привет Украина",WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, 0, CW_USEDEFAULT,0, (HWND)NULL, (HMENU)NULL,
       (HINSTANCE)hInstance,NULL);
   if(!hMainWnd)
   {
       MessageBox(NULL,L"Не можно создать основное окно",L"Ошибка",MB_OK);
       return 0;
   }
   //Показываем наше окно
   ShowWindow(hMainWnd, nCmdShow);
   UpdateWindow(hMainWnd);
   //Выполняем цикл обработки сообщений до закрытия программы
   while(GetMessage(&msg,NULL,0,0))  
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
   }
   return (int)msg.wParam;    // return был не на том месте
}
//=======================================================================================
LRESULT CALLBACK WindProc(HWND hWnd, UINT uMsg, WPARAM, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    switch(uMsg)
    {
    case WM_PAINT:
        BeginPaint(hWnd, &ps);             // отсутствовало
        GetClientRect(hWnd, &rect);
        DeawText(hDC, "Hello, World!", -1,&rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);
         EndPaint(hWnd,&ps);              // ошибка
                  break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break; 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
          return DefWindowProc(hWnd,uMsg, wParam, lParam);
    }
    return 0;
}


Это сообщение отредактировал(а) 586 - 2.10.2009, 13:32
PM   Вверх
Golovastik
Дата 2.10.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 0



1)Спасибо, теперь странно, останавливается на :

Код

         DeawText(hDC, L"Hello, World!", -1,&rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);



c:\documents and settings\admin\рабочий стол\papka\forma_api\forma_api\forma.cpp(62) : error C3861: 'DeawText': identifier not found

2) Зачем нужен #include <tchar.h>

Это сообщение отредактировал(а) Golovastik - 2.10.2009, 13:52
PM MAIL   Вверх
586
Дата 2.10.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Golovastik @  2.10.2009,  14:51 Найти цитируемый пост)
1)Спасибо, теперь странно, останавливается на :

Код
         DeawText(hDC, L"Hello, World!", -1,&rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);



c:\documents and settings\admin\рабочий стол\papka\forma_api\forma_api\forma.cpp(62) : error C3861: 'DeawText': identifier not found

Ну и что здесь непонятного?

Цитата(Golovastik @  2.10.2009,  14:51 Найти цитируемый пост)
2) Зачем нужен #include <tchar.h>

У тебя он нигде не используется. Строку можешь удалить. Для лабораторных работ сойдёт.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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