You can calculate the actual address as described here, i. e. you take the address of the instruction following the jump, which is
0x12DDC5B + 5 = 0x12DDC60
then you take the offset which is a 32-bit little endian 2's complement signed integer, so
"0x10 0xF1 0xFF 0xFF" = 0xFFFFF110 - 0x100000000 = -0xEF0
Then you add the offset to the base address computed above to obtain
0x12DDC60 + (-0xEF0) = 0x12DCD70
In C, this would look something like:
unsigned char *jmp_ptr = (unsigned char *)0x12DDC5B;
int offset; // or use ptrdiff_t if it's 32 bits wide
ReadProcessMemory(hProc, jmp_ptr + 1, &offset, sizeof offset, NULL);
unsigned char *target_ptr = jmp_ptr + 5 + offset;
(apply stylistic mash-ups to obtain C++ code. Also check the return value of the function, etc.)
You can now feed the resulting address to another call to ReadProcessMemory()
in order to obtain the pointer to the instance:
MainClass *instance = NULL;
ReadProcessMemory(hProc, target_ptr, &instance, sizeof instance, NULL);