--- include/atl/atlbase.h.orig	2005-04-14 17:54:32.000000000 +0900
+++ include/atl/atlbase.h	2007-12-23 14:38:02.467500000 +0900
@@ -10,6 +10,9 @@
 
 #ifndef __ATLBASE_H__
 #define __ATLBASE_H__
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
 
 #ifndef __cplusplus
         #error ATL requires C++ compilation (use a .cpp suffix)
@@ -73,19 +76,47 @@
 #define _ATL_TYPELIB_INDEX_LENGTH 10
 #define _ATL_QUOTES_SPACE 2
 
-#pragma pack(push, _ATL_PACKING)
+#pragma pack(push, 8)
 
 #if defined(_ATL_DLL)
         #pragma comment(lib, "atl.lib")
 #endif
 
-extern "C" const __declspec(selectany) GUID LIBID_ATLLib = {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) CLSID CLSID_Registrar = {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) IID IID_IRegistrar = {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) IID IID_IAxWinHostWindow = {0xb6ea2050,0x48a,0x11d1,{0x82,0xb9,0x0,0xc0,0x4f,0xb9,0x94,0x2e}};
-extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatch = {0xb6ea2051,0x48a,0x11d1,{0x82,0xb9,0x0,0xc0,0x4f,0xb9,0x94,0x2e}};
-extern "C" const __declspec(selectany) IID IID_IInternalConnection = {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}};
-extern "C" const __declspec(selectany) IID IID_IDocHostUIHandlerDispatch = {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}};
+#define __uuidof(I) IID_##I
+
+#include <excpt.h>
+
+namespace ATL
+{
+inline int InlineIsEqualGUID(REFGUID rguid1, REFGUID rguid2)
+{
+   return (
+      ((unsigned long *) &rguid1)[0] == ((unsigned long *) &rguid2)[0] &&
+      ((unsigned long *) &rguid1)[1] == ((unsigned long *) &rguid2)[1] &&
+      ((unsigned long *) &rguid1)[2] == ((unsigned long *) &rguid2)[2] &&
+      ((unsigned long *) &rguid1)[3] == ((unsigned long *) &rguid2)[3]);
+}
+}
+
+#ifdef _INIT_ATL_COMMON_VARS
+extern "C" const GUID LIBID_ATLLib = {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
+extern "C" const CLSID CLSID_Registrar = {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
+extern "C" const IID IID_IRegistrar = {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
+extern "C" const IID IID_IAxWinHostWindow = {0xb6ea2050,0x48a,0x11d1,{0x82,0xb9,0x0,0xc0,0x4f,0xb9,0x94,0x2e}};
+extern "C" const IID IID_IAxWinAmbientDispatch = {0xb6ea2051,0x48a,0x11d1,{0x82,0xb9,0x0,0xc0,0x4f,0xb9,0x94,0x2e}};
+extern "C" const IID IID_IInternalConnection = {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}};
+extern "C" const IID IID_IDocHostUIHandlerDispatch = {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}};
+#else
+extern "C" {
+extern const GUID LIBID_ATLLib;
+extern const CLSID CLSID_Registrar;
+extern const IID IID_IRegistrar;
+extern const IID IID_IAxWinHostWindow;
+extern const IID IID_IAxWinAmbientDispatch;
+extern const IID IID_IInternalConnection;
+extern const IID IID_IDocHostUIHandlerDispatch;
+}
+#endif
 
 #ifndef _ATL_DLL_IMPL
 namespace ATL
@@ -135,7 +166,7 @@
                 IUnknown* p = NULL;
                 if (pfnGetClassObject == NULL)
                         return S_OK;
-                HRESULT hRes = pfnGetClassObject(pfnCreateInstance, IID_IUnknown, (LPVOID*) &p);
+                HRESULT hRes = pfnGetClassObject((LPVOID)pfnCreateInstance, IID_IUnknown, (LPVOID*) &p);
                 if (SUCCEEDED(hRes))
                         hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister);
                 if (p != NULL)
@@ -284,13 +315,15 @@
 };
 #pragma pack(pop)
 
-PVOID __stdcall __AllocStdCallThunk(VOID);
-VOID  __stdcall __FreeStdCallThunk(PVOID);
+//PVOID __stdcall __AllocStdCallThunk(VOID);
+//VOID  __stdcall __FreeStdCallThunk(PVOID);
 
-#define AllocStdCallThunk() __AllocStdCallThunk()
-#define FreeStdCallThunk(p) __FreeStdCallThunk(p)
+//#define AllocStdCallThunk() __AllocStdCallThunk()
+//#define FreeStdCallThunk(p) __FreeStdCallThunk(p)
 
-#pragma comment(lib, "atlthunk.lib")
+//#pragma comment(lib, "atlthunk.lib")
+#define AllocStdCallThunk() HeapAlloc(GetProcessHeap(),0,sizeof(_stdcallthunk))
+#define FreeStdCallThunk(p) HeapFree(GetProcessHeap(), 0, p)
 
 #elif defined (_M_AMD64)
 #pragma pack(push,2)
@@ -465,7 +498,7 @@
         return( HRESULT_FROM_WIN32( nError ) );
 }
 
-inline void __declspec(noreturn) _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = EXCEPTION_NONCONTINUABLE )
+inline void _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = EXCEPTION_NONCONTINUABLE )
 {
         RaiseException( dwExceptionCode, dwExceptionFlags, 0, NULL );
 }
@@ -658,6 +691,7 @@
 class _NoAddRefReleaseOnCComPtr : public T
 {
         private:
+                _NoAddRefReleaseOnCComPtr();
                 STDMETHOD_(ULONG, AddRef)()=0;
                 STDMETHOD_(ULONG, Release)()=0;
 };
@@ -781,6 +815,7 @@
         {
                 return AtlAdvise(p, pUnk, iid, pdw);
         }
+#if 0
         HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
         {
                 ATLASSERT(p == NULL);
@@ -801,11 +836,12 @@
                 ATLASSERT(pp != NULL && *pp == NULL);
                 return p->QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
         T* p;
 };
 
 
-template <class T, const IID* piid = &__uuidof(T)>
+template <class T, const IID* piid>
 class CComQIPtr
 {
 public:
@@ -933,6 +969,7 @@
         {
                 return AtlAdvise(p, pUnk, iid, pdw);
         }
+#if 0
         HRESULT CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
         {
                 ATLASSERT(p == NULL);
@@ -953,6 +990,7 @@
                 ATLASSERT(pp != NULL && *pp == NULL);
                 return p->QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
         T* p;
 };
 
@@ -1087,12 +1125,14 @@
                         hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(IUnknown), (void**)&p);
                 return hr;
         }
+#if 0
         template <class Q>
         HRESULT QueryInterface(Q** pp)
         {
                 ATLASSERT(pp != NULL && *pp == NULL);
                 return p->QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
         IUnknown* p;
 };
 
@@ -1257,21 +1297,26 @@
 		LeaveCriticalSection(&m_sec);
 		return S_OK;
 	}
+	static void _InitHandler(void *pData, LPEXCEPTION_POINTERS ep)
+	  {
+	    HRESULT &hRes=*reinterpret_cast<HRESULT*>(pData);
+			if (STATUS_NO_MEMORY == ep->ExceptionRecord->ExceptionCode)
+				hRes = E_OUTOFMEMORY;
+			else
+				hRes = E_FAIL;
+	  }
 	HRESULT Init() throw()
 	{
 		HRESULT hRes = S_OK;
-		__try
-		{
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
+                {
+                        _sehandler.Set(_sejmpbuf, &hRes, reinterpret_cast<__SEHandler::PF>(EXCEPTION_EXECUTE_HANDLER), _InitHandler);
 			InitializeCriticalSection(&m_sec);
-		}
+                }
 		// structured exception may be raised in low memory situations
-		__except(EXCEPTION_EXECUTE_HANDLER)
-		{
-			if (STATUS_NO_MEMORY == GetExceptionCode())
-				hRes = E_OUTOFMEMORY;
-			else
-				hRes = E_FAIL;
-		}
+                _sehandler.Reset();
 		return hRes;
 	}
 
@@ -2799,10 +2844,19 @@
 
 
 class CComModule;
-__declspec(selectany) CComModule* _pModule=NULL;
+#ifdef _INIT_ATL_COMMON_VARS
+CComModule* _pModule=NULL;
+#else
+extern CComModule* _pModule;
+#endif
+
 
 // {B62F5910-6528-11d1-9611-0000F81E0D0D}
-_declspec(selectany) GUID GUID_ATLVer30 = { 0xb62f5910, 0x6528, 0x11d1, { 0x96, 0x11, 0x0, 0x0, 0xf8, 0x1e, 0xd, 0xd } };
+#ifdef _INIT_ATL_COMMON_VARS
+GUID GUID_ATLVer30 = { 0xb62f5910, 0x6528, 0x11d1, { 0x96, 0x11, 0x0, 0x0, 0xf8, 0x1e, 0xd, 0xd } };
+#else
+extern GUID GUID_ATLVer30;
+#endif
 
 class CComModule : public _ATL_MODULE
 {
@@ -4286,7 +4340,9 @@
 
 #endif
 
-__declspec(selectany) GUID CComModule::m_libid = {0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
+#ifdef _INIT_ATL_COMMON_VARS
+GUID CComModule::m_libid = {0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
+#endif
 
 #ifdef _ATL_STATIC_REGISTRY
 #define UpdateRegistryFromResource UpdateRegistryFromResourceS
@@ -4355,7 +4411,9 @@
         LONG m_nLockCnt;
 };
 
-__declspec(selectany) UINT CComApartment::ATL_CREATE_OBJECT = 0;
+#ifdef _INIT_ATL_COMMON_VARS
+UINT CComApartment::ATL_CREATE_OBJECT = 0;
+#endif
 
 class CComSimpleThreadAllocator
 {
@@ -5855,6 +5913,10 @@
                 }
 
         }
+        static int _Except(void *pThis, LPEXCEPTION_POINTERS lpEP)
+        {
+	  return reinterpret_cast<CVirtualBuffer *>(pThis)->Except(lpEP);
+	}
         void Seek(int nElement)
         {
                 if(nElement < 0 || nElement >= m_nMaxElements)
@@ -5866,41 +5928,53 @@
         {
                 if(nElement < 0 || nElement >= m_nMaxElements)
                         _AtlRaiseException((DWORD)EXCEPTION_ARRAY_BOUNDS_EXCEEDED);                
-                __try
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
                 {
+                        _sehandler.Set(_sejmpbuf, this, _Except);
                         T* p = &m_pBase[nElement];
                         *p = Element;
                         m_pTop = p > m_pTop ? p : m_pTop;
                 }
-                __except(Except(GetExceptionInformation()))
+                else
                 {
                 }
+                _sehandler.Reset();
 
         }
         template <class Q>
         void WriteBulk(Q& helper)
         {
-                __try
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
                 {
+                        _sehandler.Set(_sejmpbuf, this, _Except);
                         m_pCurrent = helper(m_pBase);
                         m_pTop = m_pCurrent > m_pTop ? m_pCurrent : m_pTop;
                 }
-                __except(Except(GetExceptionInformation()))
+                else
                 {
                 }
+                _sehandler.Reset();
         }
         void Write(const T& Element)
         {
             if (m_pCurrent < &m_pBase[m_nMaxElements]) {
-                __try
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
                 {
+                    _sehandler.Set(_sejmpbuf, this, _Except);
                     *m_pCurrent = Element;
                     m_pCurrent++;
                     m_pTop = m_pCurrent > m_pTop ? m_pCurrent : m_pTop; 
                 }
-                __except(Except(GetExceptionInformation()))
+                else
                 {
                 }
+                _sehandler.Reset();
             }
         }
         T& Read()
@@ -5910,14 +5984,18 @@
         operator BSTR()
         {
                 BSTR bstrTemp = NULL ;
-                __try
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
                 {
+                        _sehandler.Set(_sejmpbuf, this, _Except);
                         bstrTemp = SysAllocStringByteLen((char*) m_pBase,
                                 (UINT) ((BYTE*)m_pTop - (BYTE*)m_pBase));
                 }
-                __except(Except(GetExceptionInformation()))
+                else
                 {
                 }
+                _sehandler.Reset();
                 return bstrTemp;
         }
         const T& operator[](int nElement) const
@@ -6336,6 +6414,11 @@
 //Although these functions are big, they are only used once in a module
 //so we should make them inline.
 
+ATLINLINE int atlmoduleinitfilter(void *, LPEXCEPTION_POINTERS ep)
+{
+  return ep->ExceptionRecord->ExceptionCode == STATUS_NO_MEMORY ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+
 ATLINLINE ATLAPI AtlModuleInit(_ATL_MODULE* pM, _ATL_OBJMAP_ENTRY* p, HINSTANCE h)
 {
         ATLASSERT(pM != NULL);
@@ -6352,32 +6435,43 @@
         pM->m_hInst = pM->m_hInstTypeLib = pM->m_hInstResource = h;
         pM->m_nLockCnt=0L;
         pM->m_hHeap = NULL;
-        __try {
+        jmp_buf _sejmpbuf;
+        __SEHandler _sehandler;
+        if (__builtin_setjmp(_sejmpbuf) == 0) {
+            _sehandler.Set(_sejmpbuf, NULL, atlmoduleinitfilter);
             InitializeCriticalSection(&pM->m_csTypeInfoHolder);
-        } __except (GetExceptionCode() == STATUS_NO_MEMORY ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
+        } else {
             ZeroMemory(&pM->m_csTypeInfoHolder, sizeof(pM->m_csTypeInfoHolder));
-            return STATUS_NO_MEMORY;
+            _sehandler.Reset();
+	    return STATUS_NO_MEMORY;
         }
+        _sehandler.Reset();
 
-        __try {
+        if (__builtin_setjmp(_sejmpbuf) == 0) {
+            _sehandler.Set(_sejmpbuf, NULL, atlmoduleinitfilter);
             InitializeCriticalSection(&pM->m_csWindowCreate);
-        } __except (GetExceptionCode() == STATUS_NO_MEMORY ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
+        } else {
             DeleteCriticalSection(&pM->m_csTypeInfoHolder);
             ZeroMemory(&pM->m_csWindowCreate, sizeof(pM->m_csWindowCreate));
             ZeroMemory(&pM->m_csTypeInfoHolder, sizeof(pM->m_csTypeInfoHolder));
+            _sehandler.Reset();
             return STATUS_NO_MEMORY;
         }
+        _sehandler.Reset();
 
-        __try {
+        if (__builtin_setjmp(_sejmpbuf) == 0) {
+            _sehandler.Set(_sejmpbuf, NULL, atlmoduleinitfilter);
             InitializeCriticalSection(&pM->m_csObjMap);
-        } __except (GetExceptionCode() == STATUS_NO_MEMORY ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
+        } else {
             DeleteCriticalSection(&pM->m_csWindowCreate);
             DeleteCriticalSection(&pM->m_csTypeInfoHolder);
             ZeroMemory(&pM->m_csObjMap, sizeof(pM->m_csObjMap));
             ZeroMemory(&pM->m_csWindowCreate, sizeof(pM->m_csWindowCreate));
             ZeroMemory(&pM->m_csTypeInfoHolder, sizeof(pM->m_csTypeInfoHolder));
+            _sehandler.Reset();
             return STATUS_NO_MEMORY;
         }
+        _sehandler.Reset();
 #ifdef _ATL_DLL_IMPL
         if (pM->cbSize > _nAtlModuleVer21Size)
 #endif
@@ -6450,6 +6544,11 @@
         return hRes;
 }
 
+ATLINLINE void atlfinalleavecriticalsection(void *pData)
+{
+  LeaveCriticalSection(reinterpret_cast<LPCRITICAL_SECTION>(pData));
+}
+
 ATLINLINE ATLAPI AtlModuleGetClassObject(_ATL_MODULE* pM, REFCLSID rclsid, REFIID riid, LPVOID* ppv)
 {
         ATLASSERT(pM != NULL);
@@ -6473,15 +6572,15 @@
                         if (pEntry->pCF == NULL)
                         {
                                 EnterCriticalSection(&pM->m_csObjMap);
-                                __try
+                                jmp_buf _sejmpbuf;
+                                __SEHandler _sehandler;
+                                if (__builtin_setjmp(_sejmpbuf) == 0)
                                 {
+                                        _sehandler.Set(_sejmpbuf, &pM->m_csObjMap, EXCEPTION_CONTINUE_SEARCH, NULL, atlfinalleavecriticalsection);
                                         if (pEntry->pCF == NULL)
-                                                hRes = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, IID_IUnknown, (LPVOID*)&pEntry->pCF);
-                                }
-                                __finally
-                                {
-                                        LeaveCriticalSection(&pM->m_csObjMap);
+						hRes = pEntry->pfnGetClassObject((void *)(pEntry->pfnCreateInstance), IID_IUnknown, (LPVOID*)&pEntry->pCF);
                                 }
+                                _sehandler.Reset();
                         }
                         if (pEntry->pCF != NULL)
                                 hRes = pEntry->pCF->QueryInterface(riid, ppv);
--- include/atl/atlcom.h.orig	2005-04-14 17:54:32.000000000 +0900
+++ include/atl/atlcom.h	2007-12-03 22:43:54.833375000 +0900
@@ -10,6 +10,9 @@
 
 #ifndef __ATLCOM_H__
 #define __ATLCOM_H__
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
 
 #ifndef __cplusplus
         #error ATL requires C++ compilation (use a .cpp suffix)
@@ -19,7 +22,10 @@
         #error atlcom.h requires atlbase.h to be included first
 #endif
 
-#pragma pack(push, _ATL_PACKING)
+#include <algorithm>
+using ::std::min;
+
+#pragma pack(push, 8)
 
 EXTERN_C const IID IID_ITargetFrame;
 
@@ -2191,19 +2197,23 @@
 // override it in your class and call each base class' version of this
 #define BEGIN_COM_MAP(x) public: \
         typedef x _ComMapClass; \
+        static void _CacheFinal(void *pData)\
+        {\
+                reinterpret_cast<_ComMapClass*>(pData)->Unlock();\
+        }\
         static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD_PTR dw)\
         {\
                 _ComMapClass* p = (_ComMapClass*)pv;\
                 p->Lock();\
                 HRESULT hRes = E_FAIL; \
-                __try \
+                jmp_buf _sejmpbuf; \
+                __SEHandler _sehandler; \
+                if (__builtin_setjmp(_sejmpbuf) == 0) \
                 { \
+                        _sehandler.Set(_sejmpbuf, p, EXCEPTION_CONTINUE_SEARCH, NULL, _CacheFinal);\
                         hRes = CComObjectRootBase::_Cache(pv, iid, ppvObject, dw);\
                 } \
-                __finally \
-                { \
-                        p->Unlock();\
-                } \
+                _sehandler.Reset();\
                 return hRes;\
         }\
         IUnknown* _GetRawUnknown() \
@@ -2339,7 +2349,7 @@
    return( pMap ); }
 
 #define BEGIN_OBJECT_MAP(x) static _ATL_OBJMAP_ENTRY x[] = {
-#define END_OBJECT_MAP()   {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
+#define END_OBJECT_MAP()   {NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL}};
 #define OBJECT_ENTRY(clsid, class) {&clsid, class::UpdateRegistry, class::_ClassFactoryCreatorClass::CreateInstance, class::_CreatorClass::CreateInstance, NULL, 0, class::GetObjectDescription, class::GetCategoryMap, class::ObjectMain },
 #define OBJECT_ENTRY_NON_CREATEABLE(class) {&CLSID_NULL, class::UpdateRegistry, NULL, NULL, NULL, 0, NULL, class::GetCategoryMap, class::ObjectMain },
 
@@ -2492,9 +2502,9 @@
 public:
         typedef ThreadModel _ThreadModel;
 #ifdef OLD_ATL_CRITSEC_CODE
-        typename typedef _ThreadModel::AutoCriticalSection _CritSec;
+        typedef typename _ThreadModel::AutoCriticalSection _CritSec;
 #else
-    	typename typedef _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
+    	typedef typename _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
 #endif  /* OLD_ATL_CRITSEC_CODE */
         typedef CComObjectLockT<_ThreadModel> ObjectLock;
 
@@ -2638,8 +2648,8 @@
         // Set refcount to 1 to protect destruction
         ~CComObject()
         {
-                m_dwRef = 1L;
-                FinalRelease();
+                this->m_dwRef = 1L;
+                this->FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(_GetRawUnknown());
 #endif
@@ -2647,22 +2657,24 @@
         }
         //If InternalAddRef or InternalRelease is undefined then your class
         //doesn't derive from CComObjectRoot
-        STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
+        STDMETHOD_(ULONG, AddRef)() {return this->InternalAddRef();}
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 return l;
         }
         //if _InternalQueryInterface is undefined then you forgot BEGIN_COM_MAP
         STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
-        {return _InternalQueryInterface(iid, ppvObject);}
+        {return this->_InternalQueryInterface(iid, ppvObject);}
+#if 0
         template <class Q>
         HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
         {
                 return QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
 
         static HRESULT WINAPI CreateInstance(CComObject<Base>** pp);
 };
@@ -2719,8 +2731,8 @@
 #endif  /* OLD_ATL_CRITSEC_CODE */
         ~CComObjectCached()
         {
-                m_dwRef = 1L;
-                FinalRelease();
+                this->m_dwRef = 1L;
+                this->FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(_GetRawUnknown());
 #endif
@@ -2729,14 +2741,14 @@
         //doesn't derive from CComObjectRoot
         STDMETHOD_(ULONG, AddRef)()
         {
-                ULONG l = InternalAddRef();
+                ULONG l = this->InternalAddRef();
                 if (l == 2)
                         _Module.Lock();
                 return l;
         }
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 else if (l == 1)
@@ -2745,7 +2757,7 @@
         }
         //if _InternalQueryInterface is undefined then you forgot BEGIN_COM_MAP
         STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
-        {return _InternalQueryInterface(iid, ppvObject);}
+        {return this->_InternalQueryInterface(iid, ppvObject);}
 #ifndef OLD_ATL_CRITSEC_CODE
     	CComGlobalsThreadModel::AutoDeleteCriticalSection m_csCached;
 #endif  /* OLD_ATL_CRITSEC_CODE */
@@ -2762,8 +2774,8 @@
         // Set refcount to 1 to protect destruction
         ~CComObjectNoLock()
         {
-                m_dwRef = 1L;
-                FinalRelease();
+                this->m_dwRef = 1L;
+                this->FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(_GetRawUnknown());
 #endif
@@ -2771,17 +2783,17 @@
 
         //If InternalAddRef or InternalRelease is undefined then your class
         //doesn't derive from CComObjectRoot
-        STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
+        STDMETHOD_(ULONG, AddRef)() {return this->InternalAddRef();}
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 return l;
         }
         //if _InternalQueryInterface is undefined then you forgot BEGIN_COM_MAP
         STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
-        {return _InternalQueryInterface(iid, ppvObject);}
+        {return this->_InternalQueryInterface(iid, ppvObject);}
 };
 
 // It is possible for Base not to derive from CComObjectRoot
@@ -2794,14 +2806,14 @@
         CComObjectGlobal(void* = NULL)
         {
 #ifndef OLD_ATL_CRITSEC_CODE
-			m_hResFinalConstruct = _AtlInitialConstruct();
+			m_hResFinalConstruct = this->_AtlInitialConstruct();
 			if (SUCCEEDED(m_hResFinalConstruct))
 #endif  /* OLD_ATL_CRITSEC_CODE */
-                m_hResFinalConstruct = FinalConstruct();
+                m_hResFinalConstruct = this->FinalConstruct();
         }
         ~CComObjectGlobal()
         {
-                FinalRelease();
+                this->FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(_GetRawUnknown());
 #endif
@@ -2810,7 +2822,7 @@
         STDMETHOD_(ULONG, AddRef)() {return _Module.Lock();}
         STDMETHOD_(ULONG, Release)(){return _Module.Unlock();}
         STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
-        {return _InternalQueryInterface(iid, ppvObject);}
+        {return this->_InternalQueryInterface(iid, ppvObject);}
         HRESULT m_hResFinalConstruct;
 };
 
@@ -2824,14 +2836,14 @@
         CComObjectStack(void* = NULL)
         {
 #ifndef OLD_ATL_CRITSEC_CODE
-			m_hResFinalConstruct = _AtlInitialConstruct();
+			m_hResFinalConstruct = this->_AtlInitialConstruct();
 			if (SUCCEEDED(m_hResFinalConstruct))
 #endif  /* OLD_ATL_CRITSEC_CODE */
-                m_hResFinalConstruct = FinalConstruct();
+                m_hResFinalConstruct = this->FinalConstruct();
         }
         ~CComObjectStack()
         {
-                FinalRelease();
+                this->FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(_GetRawUnknown());
 #endif
@@ -2850,6 +2862,8 @@
 {
 public:
         typedef Base _BaseClass;
+        using Base::_GetRawUnknown;
+        using Base::m_pOuterUnknown;
         CComContainedObject(void* pv) {m_pOuterUnknown = (IUnknown*)pv;}
 #ifdef _ATL_DEBUG_INTERFACES
         ~CComContainedObject()
@@ -2859,20 +2873,22 @@
         }
 #endif
 
-        STDMETHOD_(ULONG, AddRef)() {return OuterAddRef();}
-        STDMETHOD_(ULONG, Release)() {return OuterRelease();}
+        STDMETHOD_(ULONG, AddRef)() {return this->OuterAddRef();}
+        STDMETHOD_(ULONG, Release)() {return this->OuterRelease();}
         STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
         {
-                HRESULT hr = OuterQueryInterface(iid, ppvObject);
+                HRESULT hr = this->OuterQueryInterface(iid, ppvObject);
                 if (FAILED(hr) && _GetRawUnknown() != m_pOuterUnknown)
-                        hr = _InternalQueryInterface(iid, ppvObject);
+                        hr = this->_InternalQueryInterface(iid, ppvObject);
                 return hr;
         }
+#if 0
         template <class Q>
         HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
         {
                 return QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
         //GetControllingUnknown may be virtual if the Base class has declared
         //DECLARE_GET_CONTROLLING_UNKNOWN()
         IUnknown* GetControllingUnknown()
@@ -2915,18 +2931,18 @@
         // override it in your class and call each base class' version of this
         HRESULT FinalConstruct()
         {
-                CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
+                CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
                 return m_contained.FinalConstruct();
         }
         void FinalRelease()
         {
-                CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
+                CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
                 m_contained.FinalRelease();
         }
         // Set refcount to 1 to protect destruction
         ~CComAggObject()
         {
-                m_dwRef = 1L;
+                this->m_dwRef = 1L;
                 FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(this);
@@ -2934,10 +2950,10 @@
                 _Module.Unlock();
         }
 
-        STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
+        STDMETHOD_(ULONG, AddRef)() {return this->InternalAddRef();}
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 return l;
@@ -2959,11 +2975,13 @@
                         hRes = m_contained._InternalQueryInterface(iid, ppvObject);
                 return hRes;
         }
+#if 0
         template <class Q>
         HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
         {
                 return QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
         static HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, CComAggObject<contained>** pp)
         {
                 _ATL_VALIDATE_OUT_POINTER(pp);
@@ -3023,21 +3041,21 @@
         // override it in your class and call each base class' version of this
         HRESULT FinalConstruct()
         {
-                InternalAddRef();
-                CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
+                this->InternalAddRef();
+                CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
                 HRESULT hr = m_contained.FinalConstruct();
-                InternalRelease();
+                this->InternalRelease();
                 return hr;
         }
         void FinalRelease()
         {
-                CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
+                CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
                 m_contained.FinalRelease();
         }
         // Set refcount to 1 to protect destruction
         ~CComPolyObject()
         {
-                m_dwRef = 1L;
+                this->m_dwRef = 1L;
                 FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(this);
@@ -3045,10 +3063,10 @@
                 _Module.Unlock();
         }
 
-        STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
+        STDMETHOD_(ULONG, AddRef)() {return this->InternalAddRef();}
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 return l;
@@ -3072,11 +3090,13 @@
                         hRes = m_contained._InternalQueryInterface(iid, ppvObject);
                 return hRes;
         }
+#if 0
         template <class Q>
         HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
         {
                 return QueryInterface(__uuidof(Q), (void**)pp);
         }
+#endif
         static HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, CComPolyObject<contained>** pp)
         {
                 _ATL_VALIDATE_OUT_POINTER(pp);
@@ -3111,27 +3131,28 @@
 class CComTearOffObject : public Base
 {
 public:
+        using Base::m_pOwner;
         CComTearOffObject(void* pv)
         {
                 ATLASSERT(m_pOwner == NULL);
-                m_pOwner = reinterpret_cast<CComObject<Base::_OwnerClass>*>(pv);
+                m_pOwner = reinterpret_cast<CComObject<typename Base::_OwnerClass>*>(pv);
                 m_pOwner->AddRef();
         }
         // Set refcount to 1 to protect destruction
         ~CComTearOffObject()
         {
-                m_dwRef = 1L;
-                FinalRelease();
+                this->m_dwRef = 1L;
+                this->FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(_GetRawUnknown());
 #endif
                 m_pOwner->Release();
         }
 
-        STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
+        STDMETHOD_(ULONG, AddRef)() {return this->InternalAddRef();}
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 return l;
@@ -3150,27 +3171,27 @@
 public:
         typedef contained _BaseClass;
         CComCachedTearOffObject(void* pv) :
-                m_contained(((contained::_OwnerClass*)pv)->GetControllingUnknown())
+                m_contained(((typename contained::_OwnerClass*)pv)->GetControllingUnknown())
         {
                 ATLASSERT(m_contained.m_pOwner == NULL);
-                m_contained.m_pOwner = reinterpret_cast<CComObject<contained::_OwnerClass>*>(pv);
+                m_contained.m_pOwner = reinterpret_cast<CComObject<typename contained::_OwnerClass>*>(pv);
         }
         //If you get a message that this call is ambiguous then you need to
         // override it in your class and call each base class' version of this
         HRESULT FinalConstruct()
         {
-                CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
+                CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
                 return m_contained.FinalConstruct();
         }
         void FinalRelease()
         {
-                CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
+                CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
                 m_contained.FinalRelease();
         }
         // Set refcount to 1 to protect destruction
         ~CComCachedTearOffObject()
         {
-                m_dwRef = 1L;
+                this->m_dwRef = 1L;
                 FinalRelease();
 #ifdef _ATL_DEBUG_INTERFACES
                 _Module.DeleteNonAddRefThunk(this);
@@ -3178,10 +3199,10 @@
         }
 
 
-        STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
+        STDMETHOD_(ULONG, AddRef)() {return this->InternalAddRef();}
         STDMETHOD_(ULONG, Release)()
         {
-                ULONG l = InternalRelease();
+                ULONG l = this->InternalRelease();
                 if (l == 0)
                         delete this;
                 return l;
@@ -3260,7 +3281,9 @@
 {
 public:
         typedef license _LicenseClass;
-        typedef CComClassFactory2<license> _ComMapClass;
+        using license::IsLicenseValid;
+        using license::GetLicenseKey;
+//        typedef CComClassFactory2<license> _ComMapClass;
 BEGIN_COM_MAP(CComClassFactory2<license>)
         COM_INTERFACE_ENTRY(IClassFactory)
         COM_INTERFACE_ENTRY(IClassFactory2)
@@ -3297,7 +3320,7 @@
                 if (ppvObject == NULL)
                         return E_POINTER;
                 *ppvObject = NULL;
-                if ( ((bstrKey != NULL) && !VerifyLicenseKey(bstrKey)) ||
+                if ( ((bstrKey != NULL) && !this->VerifyLicenseKey(bstrKey)) ||
                          ((bstrKey == NULL) && !IsLicenseValid()) )
                         return CLASS_E_NOTLICENSED;
                 if ((pUnkOuter != NULL) && !InlineIsEqualUnknown(riid))
@@ -3363,7 +3386,7 @@
                         if (pUnkOuter != NULL)
                                 hRes = CLASS_E_NOAGGREGATION;
                         else
-                                hRes = _Module.CreateInstance(m_pfnCreateInstance, riid, ppvObj);
+                                hRes = _Module.CreateInstance((LPVOID)m_pfnCreateInstance, riid, ppvObj);
                 }
                 return hRes;
         }
@@ -3454,6 +3477,7 @@
                         lpszHelpFile, iid, hRes);
         }
 #endif
+#if 0
         template <class Q>
         static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp)
         {
@@ -3464,6 +3488,7 @@
         {
                 return T::_CreatorClass::CreateInstance(NULL, __uuidof(Q), (void**) pp);
         }
+#endif
 };
 
 // ATL doesn't support multiple LCID's at the same time
@@ -3651,7 +3676,7 @@
                         {
                                 CComPtr<ITypeInfo> spInfo(spTypeInfo);
                                 CComPtr<ITypeInfo2> spTypeInfo2;
-                                if (SUCCEEDED(spTypeInfo->QueryInterface(&spTypeInfo2)))
+                                if (SUCCEEDED(spTypeInfo->QueryInterface(IID_ITypeInfo2, (void**)&spTypeInfo2)))
                                         spInfo = spTypeInfo2;
 
                                 m_pInfo = spInfo.Detach();
@@ -3760,6 +3785,9 @@
 /////////////////////////////////////////////////////////////////////////////
 // IDispEventImpl
 
+template <class T>
+struct _ATL_EVENT_ENTRY;
+
 #ifdef _ATL_DLL
 ATLAPI AtlGetObjectSourceInterface(IUnknown* punkObj, GUID* plibid, IID* piid, unsigned short* pdwMajor, unsigned short* pdwMinor);
 #else
@@ -3909,16 +3937,17 @@
 #else
 
 #pragma warning(disable:4740)       // flow in/out of inline disables global opts
-inline void __declspec(naked) __stdcall CComStdCallThunkHelper()
+inline void __stdcall CComStdCallThunkHelper()
 {
-        __asm
-        {
-                mov eax, [esp+4];       // get pThunk
-                mov edx, [eax+4];       // get the pThunk->pThis
-                mov [esp+4], edx;       // replace pThunk with pThis
-                mov eax, [eax+8];       // get pThunk->pfn
-                jmp eax;                // jump pfn
-        };
+  asm(
+      " movl $8(%ebp), %eax\n"       // get pThunk
+      " movl $4(%eax), edx\n"       // get the pThunk->pThis
+      " movl %edx, $8(%ebp)\n"       // replace pThunk with pThis
+      " movl $8(%eax), %eax\n"       // get pThunk->pfn
+      "	movl %ebp, %esp\n"
+      "	popl %ebp\n"
+      "	jmp %eax"                // jump pfn
+      );
 }
 #pragma warning(default:4740)
 #endif
@@ -3985,6 +4014,7 @@
 class ATL_NO_VTABLE IDispEventSimpleImpl : public _IDispEventLocator<nID, pdiid>
 {
 public:
+        using _IDispEventLocator<nID, pdiid>::m_dwEventCookie;
         STDMETHOD(_LocDEQueryInterface)(REFIID riid, void ** ppvObject)
         {
                 _ATL_VALIDATE_OUT_POINTER(ppvObject);
@@ -3992,7 +4022,7 @@
                 if (InlineIsEqualGUID(riid, *pdiid) || 
                         InlineIsEqualUnknown(riid) ||
                         InlineIsEqualGUID(riid, IID_IDispatch) ||
-                        InlineIsEqualGUID(riid, m_iid))
+                        InlineIsEqualGUID(riid, this->m_iid))
                 {
                         *ppvObject = this;
                         AddRef();
@@ -4186,6 +4216,10 @@
 {
 public:
         typedef tihclass _tihclass;
+        using IDispEventSimpleImpl<nID, T, pdiid>::m_libid;
+        using IDispEventSimpleImpl<nID, T, pdiid>::m_iid;
+        using IDispEventSimpleImpl<nID, T, pdiid>::m_wMajorVerNum;
+        using IDispEventSimpleImpl<nID, T, pdiid>::m_wMinorVerNum;
 
         IDispEventImpl()
         {
@@ -4475,6 +4509,11 @@
         }
 };
 
+template <class Base, const IID* piid, class T, class Copy, class ThreadModel = CComObjectThreadModel>
+class ATL_NO_VTABLE CComEnum;
+template <class Base, const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
+class ATL_NO_VTABLE CComEnumOnSTL;
+
 
 /////////////////////////////////////////////////////////////////////////////
 // CComEnumImpl
@@ -4746,7 +4785,7 @@
         return S_OK;
 }
 
-template <class Base, const IID* piid, class T, class Copy, class ThreadModel = CComObjectThreadModel>
+template <class Base, const IID* piid, class T, class Copy, class ThreadModel>
 class ATL_NO_VTABLE CComEnum :
         public CComEnumImpl<Base, piid, T, Copy>,
         public CComObjectRootEx< ThreadModel >
@@ -4868,7 +4907,7 @@
         return hRes;
 }
 
-template <class Base, const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
+template <class Base, const IID* piid, class T, class Copy, class CollType, class ThreadModel>
 class ATL_NO_VTABLE CComEnumOnSTL :
         public IEnumOnSTLImpl<Base, piid, T, Copy, CollType>,
         public CComObjectRootEx< ThreadModel >
@@ -4901,7 +4940,7 @@
                         return E_INVALIDARG;                        
                 HRESULT hr = E_FAIL;
                 Index--;
-                CollType::iterator iter = m_coll.begin();
+                typename CollType::iterator iter = m_coll.begin();
                 while (iter != m_coll.end() && Index > 0)
                 {
                         iter++;
@@ -5314,7 +5353,7 @@
                 if (InlineIsEqualGUID(riid, IID_IConnectionPoint) || InlineIsEqualUnknown(riid))
                 {
                         *ppvObject = this;
-                        AddRef();
+                        this->AddRef();
 #ifdef _ATL_DEBUG_INTERFACES
                         _Module.AddThunk((IUnknown**)ppvObject, _T("IConnectionPointImpl"), riid);
 #endif // _ATL_DEBUG_INTERFACES
--- include/atl/atlconv.h.orig	2005-04-14 17:54:32.000000000 +0900
+++ include/atl/atlconv.h	2007-12-31 07:29:34.759750000 +0900
@@ -10,6 +10,9 @@
 
 #ifndef __ATLCONV_H__
 #define __ATLCONV_H__
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
 
 #ifndef __cplusplus
         #error ATL requires C++ compilation (use a .cpp suffix)
@@ -30,7 +33,11 @@
 // Following code is to avoid alloca causing a stack overflow.
 // It is intended for use from the _ATL_SAFE_ALLOCA macros 
 // or Conversion macros.
-__declspec(selectany) DWORD _Atlosplatform = 0;
+#ifdef _INIT_ATL_COMMON_VARS
+DWORD _Atlosplatform = 0;
+#else
+extern DWORD _Atlosplatform;
+#endif
 inline BOOL _AtlGetVersionEx()
 {
         OSVERSIONINFO osi;
@@ -156,8 +163,11 @@
 #pragma prefast(suppress:515, "Atlresetstkoflw is the same as resetstkoflw")
 
 // Verifies if sufficient space is available on the stack.
-inline bool _AtlVerifyStackAvailable(SIZE_T Size)
+inline bool _AtlVerifyStackAvailable(SIZE_T /*Size*/)
 {
+#if 1
+    return false;
+#else
     bool bStackAvailable = true;
 
     __try
@@ -173,6 +183,7 @@
         _Atlresetstkoflw();
     }
     return bStackAvailable;
+#endif
 }
 
 #pragma prefast(pop)
@@ -281,15 +292,15 @@
 
 #ifdef _CONVERSION_USES_THREAD_LOCALE
         #ifndef _DEBUG
-                #define USES_CONVERSION int _convert; _convert; UINT _acp = GetACP(); _acp; LPCWSTR _lpw; _lpw; LPCSTR _lpa; _lpa
+                #define USES_CONVERSION int _convert; (void)_convert; UINT _acp = GetACP(); (void)_acp; LPCWSTR _lpw; (void)_lpw; LPCSTR _lpa; (void)_lpa
         #else
-                #define USES_CONVERSION int _convert = 0; _convert; UINT _acp = GetACP(); _acp; LPCWSTR _lpw = NULL; _lpw; LPCSTR _lpa = NULL; _lpa
+                #define USES_CONVERSION int _convert = 0; (void)_convert; UINT _acp = GetACP(); (void)_acp; LPCWSTR _lpw = NULL; (void)_lpw; LPCSTR _lpa = NULL; (void)_lpa
         #endif
 #else
         #ifndef _DEBUG
-                #define USES_CONVERSION int _convert; _convert; UINT _acp = CP_ACP; _acp; LPCWSTR _lpw; _lpw; LPCSTR _lpa; _lpa
+                #define USES_CONVERSION int _convert; (void)_convert; UINT _acp = CP_ACP; (void)_acp; LPCWSTR _lpw; (void)_lpw; LPCSTR _lpa; (void)_lpa
         #else
-                #define USES_CONVERSION int _convert = 0; _convert; UINT _acp = CP_ACP; _acp; LPCWSTR _lpw = NULL; _lpw; LPCSTR _lpa = NULL; _lpa
+                #define USES_CONVERSION int _convert = 0; (void)_convert; UINT _acp = CP_ACP; (void)_acp; LPCWSTR _lpw = NULL; (void)_lpw; LPCSTR _lpa = NULL; (void)_lpa
         #endif
 #endif
 
--- include/atl/atlctl.h.orig	2005-04-14 17:54:32.000000000 +0900
+++ include/atl/atlctl.h	2009-04-19 13:31:15.146000000 +0900
@@ -10,6 +10,9 @@
 
 #ifndef __ATLCTL_H__
 #define __ATLCTL_H__
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
 
 #ifndef __cplusplus
         #error ATL requires C++ compilation (use a .cpp suffix)
@@ -57,7 +60,7 @@
 namespace ATL
 {
 
-#pragma pack(push, _ATL_PACKING)
+#pragma pack(push, 8)
 
 // Forward declarations
 //
@@ -142,7 +145,9 @@
         CComControlBase(HWND& h) : m_hWndCD(h)
         {
                 memset(this, 0, sizeof(CComControlBase));
-                m_phWndCD = &h;
+		// previous element of m_hWndCD in this class is m_rcPos
+		*reinterpret_cast<HWND **>(reinterpret_cast<DWORD>(reinterpret_cast<char *>(&m_rcPos)+sizeof(m_rcPos)+(__alignof__(m_hWndCD)-1))&(-(__alignof__(m_hWndCD))))=&h;
+//                m_phWndCD = &h;
                 m_sizeExtent.cx = 2*2540;
                 m_sizeExtent.cy = 2*2540;
                 m_sizeNatural = m_sizeExtent;
@@ -530,13 +535,13 @@
         SIZE m_sizeNatural; //unscaled size in himetric
         SIZE m_sizeExtent;  //current extents in himetric
         RECT m_rcPos; // position in pixels
-#pragma warning(disable: 4510 4610) // unnamed union
-        union
-        {
+//#pragma warning(disable: 4510 4610) // unnamed union
+//        union
+//        {
                 HWND& m_hWndCD;
-                HWND* m_phWndCD;
-        };
-#pragma warning(default: 4510 4610)
+//                HWND* m_phWndCD;
+//        };
+//#pragma warning(default: 4510 4610)
         union
         {
                 // m_nFreezeEvents is the only one actually used
@@ -1362,7 +1367,7 @@
 class ATL_NO_VTABLE CComControl :  public CComControlBase, public WinBase
 {
 public:
-        CComControl() : CComControlBase(m_hWnd) {}
+        CComControl() : CComControlBase(this->m_hWnd) {}
         HRESULT FireOnRequestEdit(DISPID dispID)
         {
                 T* pT = static_cast<T*>(this);
@@ -1401,6 +1406,8 @@
 class CComCompositeControl : public CComControl< T, CAxDialogImpl< T > >
 {
 public:
+        using CComControl< T, CAxDialogImpl< T > >::m_hWnd;
+        using CComControl< T, CAxDialogImpl< T > >::GetNextDlgTabItem;
         CComCompositeControl()
         {
                 m_hbrBackground = NULL;
@@ -1429,7 +1436,7 @@
                         m_hbrBackground = NULL;
                 }
                 OLE_COLOR clr;
-                HRESULT hr = GetAmbientBackColor(clr);
+                HRESULT hr = this->GetAmbientBackColor(clr);
                 if (SUCCEEDED(hr))
                 {
                         COLORREF rgb;
@@ -1443,7 +1450,7 @@
         {
                 CAxWindow wnd(hwnd);
                 CComPtr<IAxWinAmbientDispatch> spDispatch;
-                wnd.QueryHost(&spDispatch);
+                wnd.QueryHost(IID_IAxWinAmbientDispatch, (void**)&spDispatch);
                 if (spDispatch != NULL)
                         spDispatch->put_BackColor((OLE_COLOR)l);
                 return TRUE;
@@ -1458,10 +1465,10 @@
         }
         HWND Create(HWND hWndParent, RECT& /*rcPos*/, LPARAM dwInitParam = NULL)
         {
-                CComControl< T, CAxDialogImpl< T > >::Create(hWndParent, dwInitParam);
+                this->Create(hWndParent, dwInitParam);
                 SetBackgroundColorFromAmbient();
                 if (m_hWnd != NULL)
-                        ShowWindow(SW_SHOWNOACTIVATE);
+                        this->ShowWindow(SW_SHOWNOACTIVATE);
                 return m_hWnd;
         }
         BOOL CalcExtent(SIZE& size)
@@ -1488,7 +1495,7 @@
                         return FALSE;
                 // find a direct child of the dialog from the window that has focus
                 HWND hWndCtl = ::GetFocus();
-                if (IsChild(hWndCtl) && ::GetParent(hWndCtl) != m_hWnd)
+                if (this->IsChild(hWndCtl) && ::GetParent(hWndCtl) != m_hWnd)
                 {
                         do
                         {
@@ -1546,7 +1553,7 @@
                         break;
                 }
 
-                return IsDialogMessage(pMsg);
+                return this->IsDialogMessage(pMsg);
         }
         HRESULT IOleInPlaceObject_InPlaceDeactivate(void)
         {
@@ -1563,7 +1570,7 @@
         }
         virtual HRESULT OnDraw(ATL_DRAWINFO& di)
         {
-                if(!m_bInPlaceActive)
+                if(!this->m_bInPlaceActive)
                 {
                         HPEN hPen = (HPEN)::GetStockObject(BLACK_PEN);
                         HBRUSH hBrush = (HBRUSH)::GetStockObject(GRAY_BRUSH);
@@ -1626,7 +1633,7 @@
         }
         STDMETHOD(OnAmbientPropertyChange)(DISPID dispid)
         {
-                dispid;
+                (void)dispid;
                 ATLTRACE2(atlTraceControls,2,_T("IOleControlImpl::OnAmbientPropertyChange\n"));
                 ATLTRACE2(atlTraceControls,2,_T(" -- DISPID = %d (%d)\n"), dispid);
                 return S_OK;
@@ -2905,7 +2912,7 @@
                 ATLTRACE2(atlTraceControls,2,_T("~CBindStatusCallback\n"));
         }
 
-        STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pBinding)
+        STDMETHOD(OnStartBinding)(DWORD /*dwReserved*/, IBinding *pBinding)
         {
                 ATLTRACE2(atlTraceControls,2,_T("CBindStatusCallback::OnStartBinding\n"));
                 m_spBinding = pBinding;
@@ -2923,19 +2930,19 @@
                 return S_OK;
         }
 
-        STDMETHOD(OnLowResource)(DWORD reserved)
+        STDMETHOD(OnLowResource)(DWORD /*reserved*/)
         {
                 ATLTRACE2(atlTraceControls,2,_T("CBindStatusCallback::OnLowResource"));
                 return S_OK;
         }
 
-        STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
+        STDMETHOD(OnProgress)(ULONG /*ulProgress*/, ULONG /*ulProgressMax*/, ULONG /*ulStatusCode*/, LPCWSTR /*szStatusText*/)
         {
                 ATLTRACE2(atlTraceControls,2,_T("CBindStatusCallback::OnProgress"));
                 return S_OK;
         }
 
-        STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError)
+        STDMETHOD(OnStopBinding)(HRESULT /*hresult*/, LPCWSTR /*szError*/)
         {
                 ATLTRACE2(atlTraceControls,2,_T("CBindStatusCallback::OnStopBinding\n"));
                 (m_pT->*m_pFunc)(this, NULL, 0);
@@ -2962,7 +2969,7 @@
                 return S_OK;
         }
 
-        STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
+        STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC */*pformatetc*/, STGMEDIUM *pstgmed)
         {
                 ATLTRACE2(atlTraceControls,2,_T("CBindStatusCallback::OnDataAvailable\n"));
                 HRESULT hr = S_OK;
@@ -3005,7 +3012,7 @@
                 return hr;
         }
 
-        STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk)
+        STDMETHOD(OnObjectAvailable)(REFIID /*riid*/, IUnknown */*punk*/)
         {
                 ATLTRACE2(atlTraceControls,2,_T("CBindStatusCallback::OnObjectAvailable"));
                 return S_OK;
--- include/atl/atlwin.h.orig	2005-04-14 17:54:32.000000000 +0900
+++ include/atl/atlwin.h	2007-12-31 07:29:28.525375000 +0900
@@ -10,6 +10,9 @@
 
 #ifndef __ATLWIN_H__
 #define __ATLWIN_H__
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
 
 #ifndef __cplusplus
         #error ATL requires C++ compilation (use a .cpp suffix)
@@ -99,6 +102,8 @@
 #else
 #define CWndClassInfo CWndClassInfoA
 #endif
+template <DWORD t_dwStyle = 0, DWORD t_dwExStyle = 0> class CWinTraits;
+typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>                                        CControlWinTraits;
 template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl;
 template <class T, class TBase = CWindow> class CDialogImpl;
 #ifndef _ATL_NO_HOSTING
@@ -658,6 +663,13 @@
                 ATLASSERT(::IsWindow(m_hWnd));
                 return ::GetDlgItemText(m_hWnd, nID, lpStr, nMaxCount);
         }
+
+        HWND GetDlgItem(int nID) const
+        {
+                ATLASSERT(::IsWindow(m_hWnd));
+                return ::GetDlgItem(m_hWnd, nID);
+        }
+
         BOOL GetDlgItemText(int nID, BSTR& bstrText) const
         {
                 ATLASSERT(::IsWindow(m_hWnd));
@@ -847,12 +859,6 @@
                 return (int)::SetWindowLong(m_hWnd, GWL_ID, nID);
         }
 
-        HWND GetDlgItem(int nID) const
-        {
-                ATLASSERT(::IsWindow(m_hWnd));
-                return ::GetDlgItem(m_hWnd, nID);
-        }
-
 // Alert Functions
 
         BOOL FlashWindow(BOOL bInvert)
@@ -1319,7 +1325,9 @@
         }
 };
 
-_declspec(selectany) RECT CWindow::rcDefault = { CW_USEDEFAULT, CW_USEDEFAULT, 0, 0 };
+#ifdef _INIT_ATL_COMMON_VARS
+RECT CWindow::rcDefault = { CW_USEDEFAULT, CW_USEDEFAULT, 0, 0 };
+#endif
 
 /////////////////////////////////////////////////////////////////////////////
 // CAxWindow - client side for an ActiveX host window
@@ -1330,6 +1338,7 @@
 class CAxWindowT : public TBase
 {
 public:
+        using TBase::m_hWnd;
 // Constructors
         CAxWindowT(HWND hWnd = NULL) : TBase(hWnd)
         { }
@@ -1439,11 +1448,13 @@
                         hr = spUnk->QueryInterface(iid, ppUnk);
                 return hr;
         }
+#if 0
         template <class Q>
         HRESULT QueryHost(Q** ppUnk)
         {
                 return QueryHost(__uuidof(Q), (void**)ppUnk);
         }
+#endif
         HRESULT QueryControl(REFIID iid, void** ppUnk)
         {
                 ATLASSERT(ppUnk != NULL);
@@ -1459,11 +1470,13 @@
                         hr = spUnk->QueryInterface(iid, ppUnk);
                 return hr;
         }
+#if 0
         template <class Q>
         HRESULT QueryControl(Q** ppUnk)
         {
                 return QueryControl(__uuidof(Q), (void**)ppUnk);
         }
+#endif
         HRESULT SetExternalDispatch(IDispatch* pDisp)
         {
                 HRESULT hr;
@@ -1521,12 +1534,12 @@
         BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
         { \
                 BOOL bHandled = TRUE; \
-                hWnd; \
-                uMsg; \
-                wParam; \
-                lParam; \
-                lResult; \
-                bHandled; \
+                (void)hWnd; \
+                (void)uMsg; \
+                (void)wParam; \
+                (void)lParam; \
+                (void)lResult; \
+                (void)bHandled; \
                 switch(dwMsgMapID) \
                 { \
                 case 0:
@@ -1750,7 +1763,7 @@
 
         // search for an empty one
 
-                for(i = 0; i < m_aChainEntry.GetSize(); i++)
+                for(int i = 0; i < m_aChainEntry.GetSize(); i++)
                 {
                         if(m_aChainEntry[i] == NULL)
                         {
@@ -1841,7 +1854,7 @@
 /////////////////////////////////////////////////////////////////////////////
 // CWinTraits - Defines various default values for a window
 
-template <DWORD t_dwStyle = 0, DWORD t_dwExStyle = 0>
+template <DWORD t_dwStyle, DWORD t_dwExStyle>
 class CWinTraits
 {
 public:
@@ -1855,7 +1868,7 @@
         }
 };
 
-typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>                                        CControlWinTraits;
+//typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0>                                        CControlWinTraits;
 typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE>                CFrameWinTraits;
 typedef CWinTraits<WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, WS_EX_MDICHILD>        CMDIChildWinTraits;
 
@@ -1882,6 +1895,7 @@
 class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap
 {
 public:
+        using TBase::GetDlgItem;
         CWndProcThunk m_thunk;
         const MSG* m_pCurrentMsg;
 
@@ -1892,7 +1906,7 @@
         ~CWindowImplRoot()
         {
 #ifdef _DEBUG
-                if(m_hWnd != NULL)        // should be cleared in WindowProc
+                if(this->m_hWnd != NULL)        // should be cleared in WindowProc
                 {
                         ATLTRACE2(atlTraceWindowing, 0, _T("ERROR - Object deleted before window was destroyed\n"));
                         ATLASSERT(FALSE);
@@ -2017,6 +2031,8 @@
 class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >
 {
 public:
+        using CWindowImplRoot< TBase >::m_hWnd;
+        using CWindowImplRoot< TBase >::m_thunk;
         WNDPROC m_pfnSuperWindowProc;
 
         CWindowImplBaseT() : m_pfnSuperWindowProc(::DefWindowProc)
@@ -2049,7 +2065,7 @@
 
         LRESULT DefWindowProc()
         {
-                const MSG* pMsg = m_pCurrentMsg;
+                const MSG* pMsg = this->m_pCurrentMsg;
                 LRESULT lRes = 0;
                 if (pMsg != NULL)
                         lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam);
@@ -2091,7 +2107,7 @@
         if(pOldProc != StartWindowProc)
                 ATLTRACE2(atlTraceWindowing, 0, _T("Subclassing through a hook discarded.\n"));
 #else
-        pOldProc;        // avoid unused warning
+        (void)pOldProc;        // avoid unused warning
 #endif
         return pProc(hWnd, uMsg, wParam, lParam);
 }
@@ -2219,6 +2235,7 @@
 class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >
 {
 public:
+        using CWindowImplBaseT< TBase, TWinTraits >::StartWindowProc;
         DECLARE_WND_CLASS(NULL)
 
         HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
@@ -2226,8 +2243,8 @@
                         UINT nID = 0, LPVOID lpCreateParam = NULL)
         {
                 if (T::GetWndClassInfo().m_lpszOrigName == NULL)
-                        T::GetWndClassInfo().m_lpszOrigName = GetWndClassName();
-                ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
+                        T::GetWndClassInfo().m_lpszOrigName = this->GetWndClassName();
+                ATOM atom = T::GetWndClassInfo().Register(&(this->m_pfnSuperWindowProc));
 
                 dwStyle = T::GetWndStyle(dwStyle);
                 dwExStyle = T::GetWndExStyle(dwExStyle);
@@ -2244,6 +2261,7 @@
 class ATL_NO_VTABLE CDialogImplBaseT : public CWindowImplRoot< TBase >
 {
 public:
+        using CWindowImplRoot< TBase >::m_hWnd;
 	virtual DLGPROC GetDialogProc()
 	{
 		return DialogProc;
@@ -2344,6 +2362,9 @@
 class ATL_NO_VTABLE CDialogImpl : public CDialogImplBaseT< TBase >
 {
 public:
+        using CDialogImplBaseT< TBase >::m_hWnd;
+        using CDialogImplBaseT< TBase >::m_thunk;
+        typedef CDialogImplBaseT< TBase > CDialogImplBase_Class;
 #ifdef _DEBUG
         bool m_bModal;
         CDialogImpl() : m_bModal(false) { }
@@ -2422,6 +2443,8 @@
 class ATL_NO_VTABLE CAxDialogImpl : public CDialogImplBaseT< TBase >
 {
 public:
+        using CDialogImplBaseT< TBase >::m_hWnd;
+        using CDialogImplBaseT< TBase >::m_thunk;
 #ifdef _DEBUG
         bool m_bModal;
         CAxDialogImpl() : m_bModal(false) { }
@@ -2515,6 +2538,8 @@
 class CContainedWindowT : public TBase
 {
 public:
+        using TBase::m_hWnd;
+        using TBase::GetWndClassName;
         CWndProcThunk m_thunk;
         LPCTSTR m_lpszClassName;
         WNDPROC m_pfnSuperWindowProc;
@@ -2536,7 +2561,7 @@
         { }
 
         CContainedWindowT(CMessageMap* pObject, DWORD dwMsgMapID = 0)
-                : m_lpszClassName(TBase::GetWndClassName()),
+                : m_lpszClassName(GetWndClassName()),
                 m_pfnSuperWindowProc(::DefWindowProc),
                 m_pObject(pObject), m_dwMsgMapID(dwMsgMapID),
                 m_pCurrentMsg(NULL)
@@ -2666,7 +2691,7 @@
                 LPCTSTR szWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0,
                 UINT nID = 0, LPVOID lpCreateParam = NULL)
         {
-                m_lpszClassName = TBase::GetWndClassName();
+                m_lpszClassName = GetWndClassName();
                 m_pfnSuperWindowProc = ::DefWindowProc;
                 m_pObject = pObject;
                 m_dwMsgMapID = dwMsgMapID;
@@ -2959,8 +2984,11 @@
         {
 
                 ::EnterCriticalSection(&pM->m_csWindowCreate);
-                __try 
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
                 {
+                        _sehandler.Set(_sejmpbuf, &pM->m_csWindowCreate, EXCEPTION_CONTINUE_SEARCH, NULL, atlfinalleavecriticalsection);
                         if(p->m_atom == 0)
                         {
                                 HINSTANCE hInst = pM->m_hInst;
@@ -2979,7 +3007,7 @@
                                                 if(!::GetClassInfoExA(_Module.GetModuleInstance(), p->m_lpszOrigName, &wc))
                                                 {
                                                         fFail = TRUE;
-                                                        __leave;
+                                                        __builtin_longjmp(_sejmpbuf, 1);
                                                 }
                                         }
                                         memcpy(&p->m_wc, &wc, sizeof(WNDCLASSEX));
@@ -3011,10 +3039,7 @@
                                         p->m_atom = ::RegisterClassExA(&p->m_wc);
                         }
                 }
-                __finally 
-                {
-                        ::LeaveCriticalSection(&pM->m_csWindowCreate);
-                }
+                _sehandler.Reset();
         }
 
         if (fFail)
@@ -3038,8 +3063,11 @@
         if (p->m_atom == 0)
         {
                 ::EnterCriticalSection(&pM->m_csWindowCreate);        
-                __try
+                jmp_buf _sejmpbuf;
+                __SEHandler _sehandler;
+                if (__builtin_setjmp(_sejmpbuf) == 0)
                 {
+                        _sehandler.Set(_sejmpbuf, &pM->m_csWindowCreate, EXCEPTION_CONTINUE_SEARCH, NULL, atlfinalleavecriticalsection);
                         if(p->m_atom == 0)
                         {
                                 HINSTANCE hInst = pM->m_hInst;
@@ -3058,7 +3086,7 @@
                                                 if(!::GetClassInfoExW(_Module.GetModuleInstance(), p->m_lpszOrigName, &wc))
                                                 {
                                                         fFail = TRUE;
-                                                        __leave;
+                                                        __builtin_longjmp(_sejmpbuf, -1);
                                                 }
                                         }
                                         memcpy(&p->m_wc, &wc, sizeof(WNDCLASSEX));
@@ -3090,10 +3118,7 @@
                                         p->m_atom = ::RegisterClassExW(&p->m_wc);
                         }
                 }
-                __finally
-                {
-                        ::LeaveCriticalSection(&pM->m_csWindowCreate);
-                }
+                _sehandler.Reset();
         }
 
         if (fFail)
--- include/atl/statreg.h.orig	2005-04-14 17:54:34.000000000 +0900
+++ include/atl/statreg.h	2006-09-18 20:05:01.468750000 +0900
@@ -573,15 +573,16 @@
         return hRes;
 }
 
-__declspec(selectany) LPCTSTR CRegParser::rgszNeverDelete[] = //Component Categories
+#ifdef _INIT_ATL_COMMON_VARS
+LPCTSTR CRegParser::rgszNeverDelete[] = //Component Categories
 {
         _T("CLSID"), _T("TYPELIB")
 };
 
-__declspec(selectany) const int CRegParser::cbNeverDelete = sizeof(rgszNeverDelete) / sizeof(LPCTSTR*);
-__declspec(selectany) const int CRegParser::MAX_VALUE=4096;
-__declspec(selectany) const int CRegParser::MAX_TYPE=MAX_VALUE;
-
+const int CRegParser::cbNeverDelete = sizeof(rgszNeverDelete) / sizeof(LPCTSTR*);
+const int CRegParser::MAX_VALUE=4096;
+const int CRegParser::MAX_TYPE=MAX_VALUE;
+#endif
 
 inline BOOL CRegParser::VTFromRegType(LPCTSTR szValueType, VARTYPE& vt)
 {
