Created
December 30, 2018 19:56
-
-
Save mewmew/d70c40facf867b1f8daf5b83fb047f8f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using std::cout; | |
using std::endl; | |
// Typedef for the function pointer | |
typedef void (*_PVFV)(void); | |
// Our various functions/classes that are going to log the application startup/exit | |
struct TestClass | |
{ | |
int m_instanceID; | |
TestClass(int instanceID) : m_instanceID(instanceID) { cout << " Creating TestClass: " << m_instanceID << endl; } | |
~TestClass() {cout << " Destroying TestClass: " << m_instanceID << endl; } | |
}; | |
static int InitInt(const char *ptr) { cout << " Initializing Variable: " << ptr << endl; return 42; } | |
static void LastOnExitFunc() { puts("Called LastOnExitFunc();"); } | |
static void CInit() { puts("Called CInit();"); atexit(&LastOnExitFunc); } | |
static void CppInit() { puts("Called CppInit();"); } | |
// our variables to be intialized | |
extern "C" { static int testCVar1 = InitInt("testCVar1"); } | |
static TestClass testClassInstance1(1); | |
static int testCppVar1 = InitInt("testCppVar1"); | |
// Define where our segment names | |
#define SEGMENT_C_INIT ".CRT$XIM" | |
#define SEGMENT_CPP_INIT ".CRT$XCM" | |
// Build our various function tables and insert them into the correct segments. | |
#pragma data_seg(SEGMENT_C_INIT) | |
#pragma data_seg(SEGMENT_CPP_INIT) | |
#pragma data_seg() // Switch back to the default segment | |
// Call create our call function pointer arrays and place them in the segments created above | |
#define SEG_ALLOCATE(SEGMENT) __declspec(allocate(SEGMENT)) | |
SEG_ALLOCATE(SEGMENT_C_INIT) _PVFV c_init_funcs[] = { &CInit }; | |
SEG_ALLOCATE(SEGMENT_CPP_INIT) _PVFV cpp_init_funcs[] = { &CppInit }; | |
// Some more variables just to show that declaration order isn't affecting anything | |
extern "C" { static int testCVar2 = InitInt("testCVar2"); } | |
static TestClass testClassInstance2(2); | |
static int testCppVar2 = InitInt("testCppVar2"); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment