Reactos
at master 73 lines 1.7 kB view raw
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 16static struct counter_values counter_values = 17{ 18 0, 0, 0, 0, 5656, 0, 0 19}; 20static struct counter_values *p_counter_values; 21 22static struct init_static 23{ 24 int m_uninit; 25 int m_counter; 26 27 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 36 ~init_static() 37 { 38 p_counter_values->dtor_counter++; 39 } 40} init_static; 41 42extern "C" 43{ 44SET_COUNTER_VALUES_POINTER SetCounterValuesPointer; 45void 46WINAPI 47SetCounterValuesPointer( 48 _Out_ struct counter_values *pcv) 49{ 50 p_counter_values = pcv; 51 memcpy(pcv, &counter_values, sizeof(counter_values)); 52} 53 54BOOL 55WINAPI 56DllMain( 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}