
Hi, In MSVC __declspec (selectany) cannot be used for functions but it's possible to emulate using "__declspec(noinline) inline" (http://blogs.msdn.com/b/freik/archive/2005/10/26/485276.aspx). Seems to produce same mangled name as normal _cdecl. The workaround from Anthony Williams works well to make MFC work with boost::thread but it should be included only once per project. For boost linked dynamically, the following file allows inclusion in any number of files in the project. Actually, I included it in StdAfx.h. Did not give it extensive testing but seems to work both on Windows CE / Windows Mobile and Win32 builds. Comments are welcome. #ifdef _MSC_VER #if !defined(_LIB) && (defined(_AFXEXT) || defined(_USRDLL) || defined(_WINDLL)) // DLLs only #include <boost/thread/thread.hpp> #include <boost/thread/detail/tss_hooks.hpp> // Use custom entry point to call into boost::thread hooks // It's safe to call hooks before global data initialization by CRTL because boost::thread overrides RawDllMain which is also called earlier than CRTL's DLLMain. #pragma comment(linker, "/ENTRY:tps_entry") extern "C" BOOL WINAPI _DllMainCRTStartup( HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved ); // "__declspec(noinline) inline" is used to get __declspec(selectany) flag // because __declspec(selectany) cannot be applied to functions directly // Could use template for that but then mangled name should be designated as entry point extern "C" __declspec(noinline) inline BOOL WINAPI tps_entry( HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved ) { // here define DLL hook (and EXE hook below) switch (dwReason) { case DLL_PROCESS_ATTACH: boost::on_process_enter(); break; case DLL_THREAD_ATTACH: boost::on_thread_exit(); break; case DLL_THREAD_DETACH: boost::on_thread_exit(); break; case DLL_PROCESS_DETACH: boost::on_process_exit(); break; } return _DllMainCRTStartup(hDllHandle, dwReason, lpreserved); } // Special protocol to indicate to boost::thread that we did support custom tss cleanup hooks // Use of "__declspec(noinline) inline" allows multiple definition across the project as results in __declspec(selectany) flag namespace boost { __declspec(noinline) inline void tss_cleanup_implemented() { } } // Just to force inclusion of custom entry point to obj. Template is used to get __declspec(selectany) flag. // Inline functions are not compiled in; even under debug. template <typename> int tps_dummy_reserved() { return &boost::tss_cleanup_implemented && &tps_entry; } template int tps_dummy_reserved<int>(); #endif // DLLs only #endif -- View this message in context: http://boost.2283326.n4.nabble.com/Fwd-Thread-Solution-to-conflict-with-MFC-... Sent from the Boost - Dev mailing list archive at Nabble.com.