1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for static C++ object construction/destruction in a DLL
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include <apitest.h>
9 #include "dll_startup.h"
10
11 // we test the initial value of m_uninit variable here, so this is required
12 #ifdef __GNUC__
13 #pragma GCC diagnostic ignored "-Wuninitialized"
14 #endif
15
16 static struct counter_values counter_values =
17 {
18 0, 0, 0, 0, 5656, 0, 0
19 };
20 static struct counter_values *p_counter_values;
21
22 static struct init_static
23 {
24 int m_uninit;
25 int m_counter;
26
init_staticinit_static27 init_static() :
28 m_counter(2)
29 {
30 counter_values.static_construct_counter_at_startup = counter_values.static_construct_counter;
31 counter_values.m_uninit_at_startup = m_uninit;
32 counter_values.static_construct_counter++;
33 m_uninit++;
34 }
35
~init_staticinit_static36 ~init_static()
37 {
38 p_counter_values->dtor_counter++;
39 }
40 } init_static;
41
42 extern "C"
43 {
44 SET_COUNTER_VALUES_POINTER SetCounterValuesPointer;
45 void
46 WINAPI
SetCounterValuesPointer(_Out_ struct counter_values * pcv)47 SetCounterValuesPointer(
48 _Out_ struct counter_values *pcv)
49 {
50 p_counter_values = pcv;
51 memcpy(pcv, &counter_values, sizeof(counter_values));
52 }
53
54 BOOL
55 WINAPI
DllMain(_In_ HINSTANCE hinstDLL,_In_ DWORD fdwReason,_In_ PVOID pvReserved)56 DllMain(
57 _In_ HINSTANCE hinstDLL,
58 _In_ DWORD fdwReason,
59 _In_ PVOID pvReserved)
60 {
61 if (fdwReason == DLL_PROCESS_ATTACH)
62 {
63 counter_values.m_uninit = init_static.m_uninit;
64 counter_values.m_counter = init_static.m_counter;
65 }
66 else if (fdwReason == DLL_PROCESS_DETACH)
67 {
68 p_counter_values->dtor_counter_at_detach = p_counter_values->dtor_counter;
69 }
70 return TRUE;
71 }
72
73 }
74