summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/DLLMain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/DLLMain.cpp')
-rw-r--r--cpp/src/Ice/DLLMain.cpp62
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;
+}
+
+}