2012-06-26 2 views
4

Отладка в Visual Studio 2010 (C++, неуправляемая), какова информация unused ??? или unused 0? Я добавил два скриншота, дочерний элемент - HWND в существующее окно.Отладчик VS2010 в C++, что означает «unused = ???» или «unused = 0»

Я также смущен тем фактом, что HWND иногда отображается как «неиспользуемый», иногда как «0». Имея указатель на нераспределенную память, я бы понял ситуацию, но в моем конкретном случае окно уже создано и действительно.

VS2010 unused=???

VS2010 unused=0

ответ

6

Это восходит к началу девяностых назад, когда там был только HANDLE как тип объявить дескриптор любого объекта Windows. Который был фабрикой ошибок, программисты могли перепутать код и, скажем, передать дескриптор шрифта, где был нужен дескриптор окна. Итак, макрос STRICT был добавлен позже, он обновил типы дескрипторов, поэтому микширование создает ошибку компилятора. Что выглядит в winnt.h, отредактированы для содержания:

#ifdef STRICT 
    typedef void *HANDLE; 
    #define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name 
#else 
    typedef PVOID HANDLE; 
    #define DECLARE_HANDLE(name) typedef HANDLE name 
#endif 

Пример использования:

DECLARE_HANDLE(HWND); 

структура макро суп гарантирует, что HFONT никогда не может быть использован, когда HWND, как ожидается, когда STRICT является включен, он создает несоответствие типа для типа структуры.

Теперь вы можете видеть, откуда «неиспользуемый». Он фактически не используется, только Windows может создавать значения дескриптора. Это полезно в отладчике, так как оно позволяет вам взглянуть на значение дескриптора, причем 0 или -1 являются верным признаком проблемы.

Подробнее о STRICT в this MSDN article.

+1

Можете ли вы добавить некоторые сведения о 0 и -1, какие проблемы это может означать? В моем случае я иногда вижу вопросительные знаки, иногда 0, иногда другие числа. – ST3

+0

+1 для объяснения о STRICT. также хотите узнать больше о «с 0 или -1, являющимся верным знаком проблемы». –

+0

Это значение «не ручка», указывающее, что любая функция winapi, которую вы использовали, не удалась, и вы забыли проверить наличие ошибок. –