Помогите с оберткой WinAPI - PullRequest
1 голос
/ 05 сентября 2011

Я делал простую оболочку WinAPI и столкнулся с довольно большой проблемой.Где-то в коде дескриптор класса Window (HWND) установлен в NULL, и это требуется для обработки сообщений.Я уже час искал код и ничего не могу найти.Кто-нибудь может помочь?

Git-репозиторий

Я почти уверен, что логическая ошибка происходит где-то в объявлениях ... \ Window.hpp и объявлениях ... \ Application.hpp, потому что это единственные файлы, которые содержат код, который вызывается.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Давайте начнем с этого:

namespace WinAPI{
    #include <windows.h>
    #include <commctrl.h>
}

Не делайте этого.

Это может быть сделано для работы за счет необходимости обновления вашего кода для каждого нового SDKрелиз, но это определенно не то, что нужно новичку.

Вот как включить заголовок <windows.h> в C ++:

#undef UNICODE
#define UNICODE
#undef STRICT
#define STRICT
#undef NOMINMAX
#define NOMINMAX

#include <windows.h>
#include <windowsx.h>

Поместите это в заголовок оболочки.

Включите обертку в глобальное пространство имен.

О, вопрос, о котором вы задали , логическая ошибка, из-за которой исчезло значение HWND?Вы не можете ожидать, что другие будут отлаживать ваш код.

Cheers & hth.,

0 голосов
/ 05 сентября 2011

Если вы еще не знакомы с assert(), самое время узнать об этом.Утверждение - это выражение, которое, по вашему мнению, является истинным, и которое вы бы хотели проверить отладчиком.В вашем случае вы можете посмотреть все места, которые обновляют HWND, и написать assert(newHWNDvalue != NULL);.

Утверждения являются формой комментария.В отличие от //, компилятор их компилирует, а отладчик проверяет их, и поэтому они со временем не устаревают.

assert - это макрос, и вам нужно будет включить <cassert> заголовок.В сборках релиза заявленное выражение не компилируется, поэтому никаких накладных расходов нет.Это означает, что вы обычно можете позволить себе нетривиальные чеки.Для сложных классов может быть полезно добавить метод private: bool CheckInvariants() const, чтобы вы могли assert(CheckInvariants()); в других членах.

...