1 Востаннє редагувалося Дмитро-Чебурашка (23.07.2015 20:47:16)

Тема: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Доброго часу доби! У мене в проэкті був файл


// Test.cpp: определяет точку входа для приложения.
//

#include "stdafx.h"
#include "Test.h"
//..#include "windows.h"


// LPSTR строка  с именем lpCmdLine. Она используется в том случае, если мы запускаем окно через командную строку с прописью параметров.
//nCmdShow целочисленный, определяет способ показа окна. Нужен для функции ShowWindow, которая будет описана позже. Например, с помощью него мы можем развернуть окно на весь экран, сделать его определённой высоты, прозрачным или поверх остальных.


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{



  FILE *fp;

  if((fp=fopen("test", "wb"))==NULL) {
    printf("He удается открыть файл.\n");
    exit(1);
  }

  fprintf(fp, "Это тест %d %f", 10, 20.01);
  fclose(fp);

  return (0);


    
}



  /*int MessageBox(HWND hWnd, // дескриптор родительского окна                LPCTSTR lpText, // указатель на строку с сообщением                LPCTSTR lpCaption, // указатель на строку с текстом заголовка                               UINT uType);// флаги для отображения кнопок, стиля пиктограммы и прочее  
*/

Скомпілювалося, экзэшник створював та записував файл.

Читаю статтю, в ній написано

{{{{{Объявление этого класса в windows.h выглядит так:

   struct tagWNDCLASSEX{       
UINT cbSize; // величина структуры (в байтах)      
 UINT style; // стиль класса окошка       
WNDPROC WndProc; // указатель на имя пользовательской функции       
int cbWndExtra; // число освобождаемых байтов в конце структуры       
int cbClsExtra; // число освобождаемых байтов при создании экземпляра приложения      
 HICON hIcon; // дескриптор значка        
HICON hIconMini; // .... маленького значка (в трэе)      
 HCURSOR hCursor; // .... курсора мыши     
  HBRUSH hbrBack; // .... цвета фона окошка      
 HINSTANCE hInst; // .... экземпляра приложения       
LPCTSTR lpszClassName; // указатель на const-строку, содержащюю имя класса      
 LPCTSTR lpszMenuName; // указатель на const-строку, содержащюю имя меню, применяемого для класса 
}WNDCLASSEX;  

То есть мы должны создать переменную типа WNDCLASSEX, обычно это wc, затем через неё инициализировать поля класса, примерно так:

    // создавали дескриптор окна WNDCLASSEX wc; 
// создаём экземпляр, для обращения к членам класса 
WNDCLASSEX wc.cbSize = sizeof(wc); // размер структуры (в байтах) wc.lpfnWndProc = WndProc; // указатель на пользовательскую функцию // и т.д.  

Это необходимо, чтобы использовать этот класс в дальнейшем (если мы захотим). Это будет шаблоном для создания кучи окон. Конечно, на первых порах нам не нужно столько окошек. Но регистрация нужна однозначно! Это —  формальная сторона.
}}}}}}


Я додав



HWND hMainWnd;//моє-вікно


struct tagWNDCLASSEX{       
    UINT cbSize; // величина структуры (в байтах)       
    UINT style; // стиль класса окошка       
    WNDPROC WndProc; // указатель на имя пользовательской функции       
    int cbWndExtra; // число освобождаемых байтов в конце структуры       
    int cbClsExtra; // число освобождаемых байтов при создании экземпляра приложения       
    HICON hIcon; // дескриптор значка        
    HICON hIconMini; // .... маленького значка (в трэе)       
    HCURSOR hCursor; // .... курсора мыши       
    HBRUSH hbrBack; // .... цвета фона окошка       
    HINSTANCE hInst; // .... экземпляра приложения       
    LPCTSTR lpszClassName; // указатель на const-строку, содержащюю имя класса       
    LPCTSTR lpszMenuName; // указатель на const-строку, содержащюю имя меню, применяемого для класса 
}  WNDCLASSEX;  




WPARAM Miwkn0(){


// То есть мы должны создать переменную типа WNDCLASSEX, обычно это wc, затем через неё инициализировать поля класса, примерно так:

// создавали дескриптор окна 
WNDCLASSEX wc; // создаём экземпляр, для обращения к членам класса WNDCLASSEX 
wc.cbSize = sizeof(wc); // размер структуры (в байтах) 
wc.lpfnWndProc = WndProc; // указатель на пользовательскую функцию // и т.д.  

 //ATOM WINAPI RegisterClassEx(const WNDCLASSEX *lpWindowClass);  


// регистрировали класс 
if(!RegisterClassEx(&wc))
{      // в случае отсутствия регистрации класса:      
    MessageBox(NULL,                 
        L"Не получилось зарегистрировать класс!",                 
        L"Ошибка", MB_OK);      
    return NULL; // возвращаем, следовательно, выходим из WinMain 
} // и т.д.  




// проверяли, зарегистрирован ли класс 
hMainWnd = CreateWindow(szClassName, // имя класса                 
    L"Полноценная оконная процедура", // имя окна (то что сверху)                  
    WS_OVERLAPPEDWINDOW | WS_VSCROLL, // режимы отображения окошка                  
    CW_USEDEFAULT, // положение окна по оси х (по умолчанию)                  
    NULL, // позиция окна по оси у (раз дефолт в х, то писать не нужно)                  
    CW_USEDEFAULT, // ширина окошка (по умолчанию)                  
    NULL, // высота окна (раз дефолт в ширине, то писать не нужно)                  
    HWND(NULL), // дескриптор родительского окошка (у нас нет род. окон)                 
    NULL, // дескриптор меню (у нас его нет)                  
    HINSTANCE(hInst), // .... экземпляра приложения                 
    NULL); // ничего не передаём из WndProc 
// и т.д. 

// создали окно if(!hMainWnd){    
// в случае некорректного создания окна (неверные параметры и тп):     
MessageBox(NULL, L"Не получилось создать окно!", 
    L"Ошибка", MB_OK);     
return NULL; // выходим из приложения } 
// и т.д.  


 // проверяли, создано ли окно 
ShowWindow(hMainWnd, nCommandShow); 
UpdateWindow(hMainWnd); // и т.д. 

/*Первая функция отображает окно на экране ПК. Её первый параметр – дескриптор  окошка (он возвращался  CreateWindow()). Второй параметр – стиль отображения. При первом запуске окна должен быть равен последнему параметру функции WinMain(), а в последующие разы можно вписывать свои данные (об этом в следующих статьях).

*/

// показывали, обновляли окно 

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

return msg.wParam; // всё!  

}




При спробі компіляції помилка



WNDCLASSEX: переопределение; typedef нельзя перегрузить другим символом    c:\documents and settings\димон\рабочий стол\всяке\порівнювач\файлосоюз\test\test\windows.h    17    1    Test



Це нормально, така помилка? Це повязано з чим - це особливості WNDCLASSEX- у чи я оголошую його не там де потрібно чи що?

Post's attachments

Копия (2) Test.rar 2.44 mb, 91 downloads since 2015-07-23 

2

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

В якому середовищі Ви працюєте?
Можете викласти робочу версію проекту і неробочу?

Білий Лунь

3

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Як Ви створили проект? "У мене в проэкті був файл" - неясно, звідки він взявся.

4 Востаннє редагувалося Дмитро-Чебурашка (24.07.2015 19:44:09)

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Добрий вечір!! Я працюю у середовищі Визуал Студіо 2010.

Версія проекту робоча за винятком файлу windows.h - як я його не додавав, так усе було добрє.


І що характерно, я в ньому не бачу ничого ,,кримінального,, , в усякому разі звідки бєрється typedef справді незрозуміло.

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Думаю якийсь typedef оголошений десь в іншому коді, в кодах самої Студії або де-небудь  ще!

6

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Дмитро-Чебурашка, я можу Вам тільки позаздрити, що у Вас вистачає часу на розваги на зразок цієї. Зізнайтеся, що Ви - один з працівників цього сайту, завданням якого є ціною будь-якої клоунади пожвавити форум.
Я Вас заніс до мойого ignore list, ще трошки - і форум цілком піде слідом за Вами.

7 Востаннє редагувалося Дмитро-Чебурашка (25.07.2015 10:57:34)

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Я може плутано пояснюю .. Не зрозумів у чому клоунада. Загалом що це за помилка? Де перевизначення, якщо я його взагалі не використовував?

Нехай я це, можливо схрещую в коді бика і носорога, або чого, але помилка говорить про те, що я щось не розумію, не знаю,

а може і банально туплю, але я прошу пояснень конкретно по цій помилці.

8

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

ти копіпастиш структуру, яка вже є десь в аналах windows.h

9

Re: Помилка ,,error C2377: WNDCLASSEX: переопределение; typedef нельзя пер

Спробуйте взяти робочий проект і додати тільки рядок:

#include <windows.h>

І зкомпілювати його. Думаю, що десь використовуються однакові імена, тому виникає ця помилка.

Білий Лунь