diff options
Diffstat (limited to 'cpp/src/Ice/DLLMain.cpp')
-rw-r--r-- | cpp/src/Ice/DLLMain.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/cpp/src/Ice/DLLMain.cpp b/cpp/src/Ice/DLLMain.cpp new file mode 100644 index 00000000000..6037d292817 --- /dev/null +++ b/cpp/src/Ice/DLLMain.cpp @@ -0,0 +1,62 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include <Ice/ImplicitContextI.h> +#include <Ice/Service.h> + +extern "C" BOOL WINAPI _CRT_INIT(HINSTANCE, DWORD, LPVOID); + +extern "C" +{ + +BOOL WINAPI +#ifdef __BCPLUSPLUS__ +DllMain(HINSTANCE hDLL, DWORD reason, LPVOID reserved) +{ +#else +ice_DLL_Main(HINSTANCE hDLL, DWORD reason, LPVOID reserved) +{ + // + // During ATTACH, we must call _CRT_INIT first. + // + if(reason == DLL_PROCESS_ATTACH || reason == DLL_THREAD_ATTACH) + { + if(!_CRT_INIT(hDLL, reason, reserved)) + { + return FALSE; + } + } +#endif + + if(reason == DLL_PROCESS_ATTACH) + { + Ice::Service::setModuleHandle(hDLL); + } + else if(reason == DLL_THREAD_DETACH) + { + Ice::ImplicitContextI::cleanupThread(); + } + +#ifndef __BCPLUSPLUS__ + // + // During DETACH, we must call _CRT_INIT last. + // + if(reason == DLL_PROCESS_DETACH || reason == DLL_THREAD_DETACH) + { + if(!_CRT_INIT(hDLL, reason, reserved)) + { + return FALSE; + } + } +#endif + + return TRUE; +} + +} |