feisty meow concerns codebase 2.140
dll_root.cpp
Go to the documentation of this file.
1/*****************************************************************************\
2* *
3* Name : DLL Main Root Support *
4* Author : Chris Koeritz *
5* *
6*******************************************************************************
7* Copyright (c) 1995-$now By Author. This program is free software; you can *
8* redistribute it and/or modify it under the terms of the GNU General Public *
9* License as published by the Free Software Foundation; either version 2 of *
10* the License or (at your option) any later version. This is online at: *
11* http://www.fsf.org/copyleft/gpl.html *
12* Please send any updates to: fred@gruntose.com *
13\*****************************************************************************/
14
15// Thanks to Andy Tan for some research into MFC extension dlls.
16
20
21//HOOPLE_STARTUP_CODE_DLL;
22 // initialize objects needed by the hoople libs.
23
24#ifdef _AFXDLL
25
26#ifdef DEBUG
27 #define TRACE_PRINTER(s) TRACE_PRINT(s)
28#else
29 #define TRACE_PRINTER(s)
30#endif
31
32// base for AFX dlls.
33
34#include <afxext.h> // MFC extensions.
35#include <afxdllx.h> // Extension DLL declarations; include only once!
36
37bool check_DLL_versions();
38 // supplied by the library's version of dllmain.cpp.
39
40static AFX_EXTENSION_MODULE SomeDLL = { NULL, NULL };
41
42#ifndef DLL_NAME
43 #define DLL_NAME "unnamed DLL"
44#endif
45
46extern "C" int APIENTRY
47DllMain(application_instance instance, DWORD reason, LPVOID reserved)
48{
49 SET_INSTANCE_HANDLE(instance);
50 // Remove this if you use lpReserved.
51 UNREFERENCED_PARAMETER(reserved);
52
53 char *dll_name = DLL_NAME;
54 // mainly for debugging purposes. having the value for DLL_NAME actually
55 // stored should allow us to know which dll is being debugged.
56
57 static CDynLinkLibrary *dll_link = NULL_POINTER;
58
59 static int dll_entry_count = 0;
60
61 switch (reason) {
62 case DLL_PROCESS_ATTACH: {
63 char *message = DLL_NAME " Initializing!\n";
64 TRACE_PRINTER(message);
65
66 if (!check_DLL_versions()) return 0;
67
68 // Extension DLL one-time initialization
69 if (!AfxInitExtensionModule(SomeDLL, instance)) return 0;
70
71 // Insert this DLL into the resource chain.
72 dll_link = new CDynLinkLibrary(SomeDLL);
73
74 // NOTE: If this Extension DLL is being implicitly linked to by an MFC
75 // Regular DLL (such as an ActiveX Control) instead of an MFC
76 // application, then you will want to remove this line from DllMain and
77 // put it in a separate function exported from this Extension DLL. The
78 // Regular DLL that uses this Extension DLL should then explicitly call
79 // that function to initialize this Extension DLL. Otherwise, the
80 // CDynLinkLibrary object will not be attached to the Regular DLL's
81 // resource chain, and serious problems will result.
82 ++dll_entry_count;
83 break;
84 }
85 case DLL_PROCESS_DETACH: {
86 --dll_entry_count;
87 char *message = DLL_NAME " Terminating!\n";
88 TRACE_PRINTER(message);
89 // clean up our other stuff.
90 WHACK(dll_link);
91 // Terminate the library before destructors are called.
92 AfxTermExtensionModule(SomeDLL);
93 break;
94 }
95 case DLL_THREAD_ATTACH:
96 ++dll_entry_count;
97 break;
98 case DLL_THREAD_DETACH:
99 --dll_entry_count;
100 break;
101 default:
102// do nothing.
103 break;
104 }
105
106 return 1;
107}
108
109#elif defined(__WIN32__)
110
111// regular dll base.
112
113#include <application/windoze_helper.h> // base windows stuff.
114
115bool check_DLL_versions();
116 // supplied by the library's version of dllmain.cpp.
117
118BOOL APIENTRY DllMain(HANDLE module, DWORD ul_reason_for_call, LPVOID reserved)
119{
121 switch (ul_reason_for_call) {
122 case DLL_PROCESS_ATTACH:
123 if (!check_DLL_versions()) return 0;
124 break;
125
126 // these are currently not processed.
127 case DLL_THREAD_ATTACH:
128 case DLL_THREAD_DETACH:
129 case DLL_PROCESS_DETACH:
130 break;
131 }
132 return true;
133}
134
135#endif
136
#define NULL_POINTER
The value representing a pointer to nothing.
Definition definitions.h:32
void WHACK(contents *&ptr)
deletion with clearing of the pointer.
Definition functions.h:121
Support for unicode builds.
Aids in achievement of platform independence.
void * application_instance
#define SET_INSTANCE_HANDLE(value)
use this to change the instance handle for this dll or exe.
void * HANDLE
unsigned long DWORD