Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    twgt
    int hATOM компилятор тоже глотает (и __int32).
    Дальше я не понял, зачем мне узнавать имя ATOM, если я его сам зарегистрировал и имя забыть ещё не успел :)

    iZzz32
    Поподробней можно?
    Зачем - риторический вопрос. Просто долгие годы на asm так писал, привычка, ведь получив ATOM в eax я его сразу швырял в CreateWindow.
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Тогда я не понял, почему в качестве указателя на имя класса ты передаёшь атом?!
    Так же не понял почему у тебя
    Когда он определён в windef.h как WORD.
     
  3. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    MirrorBlack, в MAKEINTATOM приведение типа к LPTSTR, чтобы компилятор не ругался (см. ниже тип lpClassName). Посмотри сам в хедере. Но зачем тебе это делать? Ты зарегал класс, имя класса, наверное, тоже помнишь, его и передавай. :-\
     
  4. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
  5. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
  6. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    twgt
    lpClassName

    Указатель на строку с символом нуля в конце или атом класса, созданный предшествующим вызовом функции RegisterClass или RegisterClassEx. Атом должен быть в младшем слове параметра lpClassName; старшее слово должно быть нулевое. Если lpClassName является строкой, параметр устанавливает имя класса окна. Имя класса может быть любым именем, зарегистрированным функцией RegisterClass или RegisterClassEx, при условии, что модуль, который регистрирует класс, является тем же модулем, который создает окно. Имя класса может также быть любым из предопределенных системных имен классов.

    Насчёт того, что ATOM определён как WORD:
    int hAtom;
    hAtom = RegisterClassEx(&wcex);
    Дизассемблерный код:
    push offset wcex
    call RegisterClassEx
    movzx eax,ax
    mov hAtom,eax

    а если так:
    ATOM hAtom;
    push offset wcex
    call RegisterClassEx
    mov hAtom,ax


    Извиняюсь - не корректно написал. Имел ввиду что второй параметр CreateWindowEx определён как LPCWSTR.

    iZzz32
    Особой разницы для программиста конечно нет в том что передавать - смещение имени или ATOM (выйгрыш пару байт).
    Но для ОС она есть. По имени класса ОС будет искать ATOM, а это не так быстро происходит.
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    MirrorBlack
    Спасибо, никогда не обращал на это внимания.
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Кстати, у атомов есть ограничение
    . Но тем не менее, скайп создает окна с атомами > 0xbfff. Никто не знает почему это работает?
     
  9. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Попытался добавить C++ класс в Visual Studio 2008.
    В результате к проекту добавляются два файла (Имя.h и Имя.cpp).
    На данном этапе всё ясно, а дальше начинаются непонятки:
    Пишу - IClass ic; Вылетает ошибка - необъявленнй идентификатор IClass. Здесь думаю ясно что надо подключит IClass.cpp
    Подключаю и наблюдаю:
    1>IClass.obj : error LNK2005: "public: __thiscall IClass::~IClass(void)" (??1IClass@@QAE@XZ) уже определен в Online.obj

    А вот ежели прописать IClass сразу в файле проекта (у меня Online.cpp) всё нормально...
    Что за нафиг?
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    MirrorBlack

    :) Подключать надо .h

    На уровне компиляции нужно иметь только данные о прототипе функций (.h), данные о ее теле (.cpp) нужны только в момент линковки.
     
  11. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Э… Реализацию класса и его декларацию раскидай по .cpp и .h соответственно. Включай .h в свой Online.cpp.
     
  12. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    _DEN_
    Подключил...
    Компиляция прошла нормально. Затем в IClass.cpp добавил функцию:
    //Это IClass.cpp
    #include "IClass.h"

    IClass::IClass(void)
    {
    }

    IClass::~IClass(void)
    {
    MessageBox(0,L"TEST",0,0);
    }
    Результат:
    1>.\IClass.cpp(9) : error C3861: MessageBox: идентификатор не найден

    Строчку #include "IClass.h" я тоже не понял...
     
  13. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    MirrorBlack, #include <windows.h> в IClass.cpp. Насчёт include "IClass.h" – да открой и посмотри на него. Может, сам догадаешься?
     
  14. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    iZzz32
    stdafx.h в каждый объект подключать?

    Я не могу понять зачем в IClass.cpp включать IClass.h если я его уже включил в Online.cpp.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    MirrorBlack

    В С++ единицей компиляции является .cpp. Каждый .cpp во время компиляции ничего не знает про другие .cpp

    [edit]

    В асме вроде также - например определения констант нужно включать в каждый .asm файл. Также и в C++.


    Если ее убрать, то во время компиляции компилер увидит, что ты пытаешся определять функции класса (IClass), который нигде не был объявлен.
     
  16. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    _DEN_
    Вразумительно, спасибо.
    Сам не знаю с чего решил что можно писать как в masm :derisive:
     
  17. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    iZzz32
    Возможно я ошибаюсь но #include <windows.h> в IClass.h подключать надо?
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    MirrorBlack
    Надо.
     
  19. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    MirrorBlack, нет, не стоит. Раз windows.h тебе нужен только для реализации метода класса, только в файл реализации и подключай. Если тебе понадобится windows.h в Online.cpp зачем-нибудь, в Online.cpp тоже включишь.
    Booster, на кой чёрт он там сдался?
     
  20. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Если IClass.h начинаеш включать структуры (например MSG) - windows.h нужен.
    Следовательно проще его сразу швырнуть в IClass.h и забыть :derisive: