Есть тут кто-нибудь, кто знает как побороть ATL в VS.NET? Проблема в том, что в ATL7.0 появилось новое средство поиска утечек памяти в ATL-проектах. Сидит вся эта беда в atldbgmem.h. Но при подключении данного файла в stdafx.h и попытке собрать проект компилятор выдает кучу ошибок в atlapp.h:
d:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\include\atlwin.h(4454): error C2065: 'lpDevMode' : undeclared identifier
d:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\include\atlwin.h(4454): error C2065: 'LPDEVMODEOLE' : undeclared identifier
d:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\include\atlwin.h(4454): error C2146: syntax error : missing ';' before identifier 'lpDevMode'
d:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\include\atlwin.h(4462): error C2440: '=' : cannot convert from ''unknown-type'' to ''unknown-type''
d:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\include\atlwin.h(4469): error C2065: 'DEVMODEOLE2T' : undeclared identifier
Звери LPDEVMODEOLE и DEVMODEOLE2T определяются в этом же файле (atlwin.h), но при включенном макросе _WINGDI_, если же определить этот макрос в stdafx.h, то компилятор вообще с ума сходит.
Здравствуйте Admiral, Вы писали:
A>Здравствуйте Андрей, Вы писали:
A>Попробуй в самое начало stdafx.h заинклудить windows.h. У меня вроде вылечило.
A>Удачи!
А при чем здесь windows.h, он у меня явно нигде не включается. Я на ATL пишу, а не на чистом API.
skip
A>В общем, попробуй, если получится — может у тебя найдется объяснение такого поведения ATL. Ну, а не получится — тогда я лажанулся.
Спасибо! Я тебя сначала неправильно понял, извини. Действительно, очень странная связь. Кстати, теперь мне придется от STL избавляться — не хочет она с этой самой atldbgmem.h дружить
skip
A>Кстати, а где можно почитать про atldbgmem, как им пользоваться и т.п.? С виду — мощная штука, а увидел только сегодня. A>Заранее благодарен.
В том и проблема, что нигде ничего путнего нет, по крайней мере, я не нашел Но, в принципе, все в ATL можно изучить по исходникам, и данную фичу тоже. Кстати, если будешь копать, как ей пользоваться — можно будет исследование опубликовать здесь же, на сайте.
Здравствуйте Андрей, Вы писали:
АА>Есть тут кто-нибудь, кто знает как побороть ATL в VS.NET?
Мы в последней версии ascLib (лежит пока только на CD) сделали свою проверку памяти. Она мощьнее чем в ATL и CRT (например, ловит утечки BSTR-ингов) и работает с обоими версиями ATL (3 и 7). Может тебе это подойдет?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
VD>Здравствуйте Андрей, Вы писали:
АА>>Есть тут кто-нибудь, кто знает как побороть ATL в VS.NET?
VD>Мы в последней версии ascLib (лежит пока только на CD) сделали свою проверку памяти. Она мощьнее чем в ATL и CRT (например, ловит утечки BSTR-ингов) и работает с обоими версиями ATL (3 и 7). Может тебе это подойдет?
Есть способ совместить STL и atldbgmem.h. Немножко геморойно, но лучше чем ничего.
Нужно перед подключением STL файлов убивать переопределение оператора 'new' и восстанавливать его по завершению подключения STL. Пример:
// подключаем дебагер памяти
#include <windows.h>
#include <atldbgmem.h>
// перед подключением <map> прячем дебагер памяти
#ifdef new
#undef new
#endif
// собственно подключаем STL
#include <map>
#include <vector>
#include <set>
// восстанавливаем трассировку выделения памяти
#ifdef __ATLDBGMEM_H__
#ifndef new
#define new new(__FILE__, __LINE__)
#endif
#endif
Фокусы с отключением и включением дебагера я прячу в отдельные H файлы, которые подключаю перед и после STL.
А>Спасибо! Я тебя сначала неправильно понял, извини. Действительно, очень странная связь. Кстати, теперь мне придется от STL избавляться — не хочет она с этой самой atldbgmem.h дружить