Тема: Использование ATL в ObjectARX 2007 (_DEBUG)

Делаю в программе
#include "atlbase.h"
для того чтобы пользоваться CRegKey (читать инфу в реестре).
Проект сгенерен визардом. ObjectARX Wizard проектам в Debug ставит ключик \MD.
В 2006 все компайлелось и запускалось.
В 2007 при попытке линковке выдается сообщение что:
_CrtDbgReportW не найдена :(. Это и понятно т.к. стоит ключик \MD (т.е. использовать релизную библиотеку).
Ставлю ключик \MDd. Все начинает компайлиться в ObjectARX 2007. Но при попытке запуска в AutoCAD 2007 arx отказывается грузиться т.к. не находятся необходимые dll.
А не находит msvcr80d.dll... Т.е. ее просто нет в папке акада и поиком по компу - она лежит только в потрахах VS 2005 и не "торчит" на ружу (т.е. не прописана в системных путях). При этом предыдущая версия msvcr70d.dll - есть в System32.
Попытка закинуть msvcr80d.dll в папку System32 приводит к тому что при загрузке ARX летят баги, что не найден манифест к DLL (т.е. она просто не зарегистрирована). Зарегить ее не получается...
Короче такое порочное кольцо - если ставить в DEBUG ключ \MD, то не собирается, если ставить \MDt, то не стартует в AutoCAD 2007...
Пока нашел такой выход: В тех местах где надо включить atlbase.h файл, делаю #include "atlbase_r.h", где "atlbase_r.h" написал сам как:
#pragma once
#ifdef _DEBUG
#undef _DEBUG
   #include "atlbase.h"
#define _DEBUG
#else
   #include "atlbase.h"
#endif
В Debug все собирается и запускается, т.е. "ручками" приходиться включать ATL в релиз моде...
Такие вот пироги.
1) Пишу для информации если кто столкнется.
2) Есть комментарии по этому поводу - що це такое и почему так? Или я опять торможу и что-то не понимаю...?
С Уважением, Константин.

Re: Использование ATL в ObjectARX 2007 (_DEBUG)

Константин! Никогда не обращал внимания, что ObjectARX Wizard при указании использовать MFC генерирует такие вставки в stdafx.h:

//-----------------------------------------------------------------------------
//----- 'DEBUG workaround' below prevents the MFC or ATL #include-s from pulling
//----- in "Afx.h" that would force the debug CRT through #pragma-s.
#if defined(_DEBUG) && !defined(_FULLDEBUG_)
#define _DEBUG_WAS_DEFINED
#undef _DEBUG
#pragma message ("     Compiling MFC / STL / ATL header files in release mode.")
#endif
//----- ObjectARX and OMF headers needs this
#include <map>
//-----------------------------------------------------------------------------
#include <afxwin.h>       //----- MFC core and standard components
#include <afxext.h>       //----- MFC extensions
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>       //----- MFC OLE classes
#include <afxodlgs.h>     //----- MFC OLE dialog classes
#include <afxdisp.h>      //----- MFC Automation classes
#endif //----- _AFX_NO_OLE_SUPPORT
#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h>        //----- MFC ODBC database classes
#endif //----- _AFX_NO_DB_SUPPORT
#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>       //----- MFC DAO database classes
#endif //----- _AFX_NO_DAO_SUPPORT
#include <afxdtctl.h>     //----- MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>       //----- MFC support for Windows Common Controls
#endif //----- _AFX_NO_AFXCMN_SUPPORT
//-----------------------------------------------------------------------------
#ifdef _DEBUG_WAS_DEFINED
#define _DEBUG
#undef _DEBUG_WAS_DEFINED
#endif

Причина очевидна - AutoCAD использует эти библиотеки в Release мode и одновременное использование внутри одного процесса Debug и Release версий одних и тех же dll чревато!

Re: Использование ATL в ObjectARX 2007 (_DEBUG)

Точно... Просто, включал требуемые файлы в .cpp файлах... по месту требования в компоненте...
Т.е. насколько я понимаю в этом свете все .h файлы от библиотек MFC и ATL Autodesk предлагает инклюдить в stdafx.h в блоке с раздефайненным _DEBUG. Да... шесть лет программирую под ObjectARX всегда узнаю что-то новое :)...

Re: Использование ATL в ObjectARX 2007 (_DEBUG)

Т.е. насколько я понимаю в этом свете все .h файлы от библиотек MFC и ATL Autodesk предлагает инклюдить в stdafx.h в блоке с раздефайненным  DEBUG.

Ну это как вариант. Можно и в своих .cpp или .h-файлах, но аналогично. Кстати, тоже самое было и в ObjectARX 2000...2002 и 2004...2006. В stdafx.h будет надежнее и быстрее компилироваться если используешь Precompiled Headers.

Re: Использование ATL в ObjectARX 2007 (_DEBUG)

У меня похожая ситуация с ATL, но просто в Visual C++ 6.
[VC6-отладка] Что за сообщение ?
---------------------------------
Для того чтобы работать с реестром в MFC:
Пишем в программе
Код:
CRegKey key;
Добавляем в начало файла
Код:
#include <atlbase.h>
В котором объявлен этот класс.
Программа замечательно компилится и работает без видимых ошибок.
2
Но! В режиме отладки в логе дебагера находим такое сообщение:
Код:
First-chance exception in RoVeR.exe (NTDLL.DLL): 0xC0000005: Access Violation.
Я так понял "есть возможность выброса исключения в RoVeR.exe ". И что? Всё нормально - ни чего не случилось? Нас просто предупреждают о предусмотренном Микрософте каком-то исключении (и откуда его копать если что?) ?
Или что-то не так?
Может надо опции компилятора в проекте поправить?
В инете смотрел, по поводу этого сообщения дебагера (у людей оно сопровождается как правило ещё парочкой ообщений, а у меня их нет) пишут насчёт не правильных указателей при передачу в функцию (LPCTSTR и прочее).
Но мы имеем просто новый голый проект - мы вставили в него только две строки.
Я из-за этого пол ночи в своей проге все указатели перелопачивал. В итоге вышел на комбинацию этих двух строк и выпал окончательно в осадок.
Теперь не знаю что думать. Нормально это или нет.
Повторюсь, нам дебагер говорит о том, что это предупреждение о такой возможности реализованной в классе которая позволяет ловить исключения или же говорит о том, что вполне реально будет утечка памяти? Или что ещё похуже - раз связано с каким-то куда-то доступом?
Кстати, если просто создать консольный проект - то такого сообщения нет. Даже со включённой Use MFC шаред dll.
---------------------------------
Ещё раз, для тех кто в танке :)
Код:
#include <atlbase.h>
CRegKey key;
И всё! Нужно эти 2 строки включить в любой MFC проект чтобы получить предупреждение дебагера.
Скорее всего так и должно быть. Я подозреваю, что дело в atlbase.h и нужно запретить/разрешить какие-то макросы-определения из других включаемых стандартных файлов в MFC-библиотеки или какой-нибудь заголовочный фал надо подрубать. Чего-то компилятору не хватает.
Эта программа со стандартными настройками проекта нормально компилятся без предупреждений компилятора и исполняется. Но добагер не доволен - что-то он такое пишет. Может он пишет о том что это как бы полезная "фишка автоматом включилась" из atlbase.h для "на всякий случай" ловли утечек пямяти? И вообще, надо разобраться что такое ATL...
_________________