diff --git a/sourcehook/generate/generate.bat b/sourcehook/generate/generate.bat index 171720e..796eafe 100644 --- a/sourcehook/generate/generate.bat +++ b/sourcehook/generate/generate.bat @@ -4,4 +4,6 @@ shworker iter %1 sourcehook.hxx sourcehook.h -shworker hopter %1 FastDelegate.hxx FastDelegate.h \ No newline at end of file +shworker hopter %1 FastDelegate.hxx FastDelegate.h + +copy *.h .. \ No newline at end of file diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx index 7be4bc2..b1da7e1 100755 --- a/sourcehook/generate/sourcehook.hxx +++ b/sourcehook/generate/sourcehook.hxx @@ -609,7 +609,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate@$+1@<@param%%|, @@, @const char *, rettype> FD; \ virtual rettype Func(@param%% p%%|, @@, @const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -619,13 +619,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype @"|" #param%%| @ "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK@$@_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype@, param%%@) \ +#define SH_DECL_HOOK@$@_void_vafmt(ifacetype, ifacefunc, attr, overload@, param%%@) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate@$+1@<@param%%|, @@, @const char *> FD; \ - virtual void Func(@param%% p%%|, @@, @const char *, ...) \ + virtual void Func(@param%% p%%|, @@, @const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ diff --git a/sourcehook/sh_memfuncinfo.h b/sourcehook/sh_memfuncinfo.h index 8adec95..a567260 100644 --- a/sourcehook/sh_memfuncinfo.h +++ b/sourcehook/sh_memfuncinfo.h @@ -100,8 +100,35 @@ namespace SourceHook // 004125A2 FF 60 04 jmp dword ptr [eax+4] // ==OR== // 00411B80 8B 01 mov eax,dword ptr [ecx] - // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] - if (*addr++ == 0x8B && *addr++ == 0x01 && *addr++ == 0xFF) + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // However, for vararg functions, they look like this: + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 0048F0B6 FF 60 08 jmp dword ptr [eax+8] + // ==OR== + // 0048F0B0 8B 44 24 04 mov eax,dword ptr [esp+4] + // 0048F0B4 8B 00 mov eax,dword ptr [eax] + // 00411B82 FF A0 18 03 00 00 jmp dword ptr [eax+318h] + + // With varargs, the this pointer is passed as if it was the first argument + + bool ok = false; + if (addr[0] == 0x8B && addr[1] == 0x44 && addr[2] == 0x24 && addr[3] == 0x04 && + addr[4] == 0x8B && addr[5] == 0x00) + { + addr += 6; + ok = true; + } + else if (addr[0] == 0x8B && addr[1] == 0x01) + { + addr += 2; + ok = true; + } + if (!ok) + return -1; + + if (*addr++ == 0xFF) { if (*addr == 0x60) { diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h index f019bb3..f7cd29f 100644 --- a/sourcehook/sourcehook.h +++ b/sourcehook/sourcehook.h @@ -608,7 +608,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate1 FD; \ virtual rettype Func(const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -618,13 +618,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype) \ +#define SH_DECL_HOOK0_void_vafmt(ifacetype, ifacefunc, attr, overload) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate1 FD; \ - virtual void Func(const char *, ...) \ + virtual void Func(const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -659,7 +659,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate2 FD; \ virtual rettype Func(param1 p1, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -669,13 +669,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1) \ +#define SH_DECL_HOOK1_void_vafmt(ifacetype, ifacefunc, attr, overload, param1) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate2 FD; \ - virtual void Func(param1 p1, const char *, ...) \ + virtual void Func(param1 p1, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -710,7 +710,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate3 FD; \ virtual rettype Func(param1 p1, param2 p2, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -720,13 +720,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2) \ +#define SH_DECL_HOOK2_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate3 FD; \ - virtual void Func(param1 p1, param2 p2, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -761,7 +761,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate4 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -771,13 +771,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3) \ +#define SH_DECL_HOOK3_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate4 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -812,7 +812,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate5 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -822,13 +822,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4) \ +#define SH_DECL_HOOK4_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate5 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -863,7 +863,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate6 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -873,13 +873,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5) \ +#define SH_DECL_HOOK5_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate6 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -914,7 +914,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate7 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -924,13 +924,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6) \ +#define SH_DECL_HOOK6_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate7 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -965,7 +965,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate8 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -975,13 +975,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7) \ +#define SH_DECL_HOOK7_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate8 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1016,7 +1016,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate9 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1026,13 +1026,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ +#define SH_DECL_HOOK8_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate9 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1067,7 +1067,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate10 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1077,13 +1077,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ +#define SH_DECL_HOOK9_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate10 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1118,7 +1118,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate11 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1128,13 +1128,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ +#define SH_DECL_HOOK10_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate11 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1169,7 +1169,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate12 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1179,13 +1179,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|" #param11 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ +#define SH_DECL_HOOK11_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate12 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1220,7 +1220,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate13 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1230,13 +1230,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|" #param11 "|" #param12 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ +#define SH_DECL_HOOK12_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate13 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1271,7 +1271,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate14 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1281,13 +1281,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|" #param11 "|" #param12 "|" #param13 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ +#define SH_DECL_HOOK13_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate14 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1322,7 +1322,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate15 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1332,13 +1332,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|" #param11 "|" #param12 "|" #param13 "|" #param14 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ +#define SH_DECL_HOOK14_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate15 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1373,7 +1373,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate16 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1383,13 +1383,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|" #param11 "|" #param12 "|" #param13 "|" #param14 "|" #param15 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ +#define SH_DECL_HOOK15_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate16 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1424,7 +1424,7 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C typedef fastdelegate::FastDelegate17 FD; \ virtual rettype Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ @@ -1434,13 +1434,13 @@ inline void SH_RELEASE_CALLCLASS_R(SourceHook::ISourceHook *shptr, SourceHook::C SHINT_MAKE_GENERICSTUFF_END(ifacetype, ifacefunc, overload, #attr "|" #rettype "|" #param1 "|" #param2 "|" #param3 "|" #param4 "|" #param5 "|" #param6 "|" #param7 "|" #param8 "|" #param9 "|" #param10 "|" #param11 "|" #param12 "|" #param13 "|" #param14 "|" #param15 "|" #param16 "|const char*|...", \ (static_cast(&ifacetype::ifacefunc))) -#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ +#define SH_DECL_HOOK16_void_vafmt(ifacetype, ifacefunc, attr, overload, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ SHINT_MAKE_GENERICSTUFF_BEGIN(ifacetype, ifacefunc, overload, (static_cast \ (&ifacetype::ifacefunc))) \ typedef fastdelegate::FastDelegate17 FD; \ - virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *, ...) \ + virtual void Func(param1 p1, param2 p2, param3 p3, param4 p4, param5 p5, param6 p6, param7 p7, param8 p8, param9 p9, param10 p10, param11 p11, param12 p12, param13 p13, param14 p14, param15 p15, param16 p16, const char *fmt, ...) \ { \ - char buf[STRBUF_LEN]; \ + char buf[::SourceHook::STRBUF_LEN]; \ va_list ap; \ va_start(ap, fmt); \ vsnprintf(buf, sizeof(buf), fmt, ap); \ diff --git a/sourcehook/test/test.vcproj b/sourcehook/test/test.vcproj index b3dc119..cb432a0 100644 --- a/sourcehook/test/test.vcproj +++ b/sourcehook/test/test.vcproj @@ -226,15 +226,18 @@ + + + RelativePath="..\sourcehook.h"> + RelativePath="..\sourcehook_impl.h"> @@ -255,7 +258,8 @@ pushd ..\generate shworker.exe iter 16 sourcehook.hxx sourcehook.h copy sourcehook.h ..\sourcehook.h -popd" +popd +" Outputs="../sourcehook.h"/> diff --git a/sourcehook/test/test1.cpp b/sourcehook/test/test1.cpp index 3cc634d..ca72e4a 100644 --- a/sourcehook/test/test1.cpp +++ b/sourcehook/test/test1.cpp @@ -12,90 +12,17 @@ namespace // Basic tests // Hooking and callclass - struct State_F1_Called : State - { - }; - - struct State_F1_PreHandler_Called : State - { - }; - - struct State_F1_PostHandler_Called : State - { - }; - - struct State_F1_HookAdded : State - { - bool m_Successfully; - State_F1_HookAdded(bool successfully) : m_Successfully(successfully) - { - } - - bool IsEqual(State *other) - { - State_F1_HookAdded *other2 = dynamic_cast(other); - if (!other2) - return false; - return other2->m_Successfully == m_Successfully; - } - }; - - struct State_F1_HookRemoved : State - { - }; - - struct State_F1_CallClassGenerated : State - { - }; - - struct State_F1_CallClassReleased : State - { - }; - - struct State_F299_Called : State - { - std::string param; - State_F299_Called(const char *p) : param(p) - { - } - bool IsEqual(State *other) - { - State_F299_Called *other2 = dynamic_cast(other); - if (!other2) - return false; - return other2->param == param; - } - }; - - struct State_F299_PreHandlerCalled : State_F299_Called - { - State_F299_PreHandlerCalled(const char *p) : State_F299_Called(p) - { - } - }; - - struct State_F299_PostHandlerCalled : State_F299_Called - { - State_F299_PostHandlerCalled(const char *p) : State_F299_Called(p) - { - } - }; - - struct State_F299Ret : State - { - bool m_Ret; - State_F299Ret(bool ret) : m_Ret(ret) - { - } - - bool IsEqual(State *other) - { - State_F299Ret *other2 = dynamic_cast(other); - if (!other2) - return false; - return other2->m_Ret == m_Ret; - } - }; + MAKE_STATE(State_F1_Called); + MAKE_STATE(State_F1_PreHandler_Called); + MAKE_STATE(State_F1_PostHandler_Called); + MAKE_STATE_1(State_F1_HookAdded, bool); + MAKE_STATE(State_F1_HookRemoved); + MAKE_STATE(State_F1_CallClassGenerated); + MAKE_STATE(State_F1_CallClassReleased); + MAKE_STATE_1(State_F299_Called, std::string); + MAKE_STATE_1(State_F299_PreHandlerCalled, std::string); + MAKE_STATE_1(State_F299_PostHandlerCalled, std::string); + MAKE_STATE_1(State_F299Ret, bool); class Test { diff --git a/sourcehook/test/test2.cpp b/sourcehook/test/test2.cpp index af84987..a365611 100644 --- a/sourcehook/test/test2.cpp +++ b/sourcehook/test/test2.cpp @@ -1,47 +1,22 @@ #include #include "sourcehook_impl.h" #include "testevents.h" +#include +// TEST2 +// Vafmt and Overloaded functions namespace { StateList g_States; SourceHook::ISourceHook *g_SHPtr; SourceHook::Plugin g_PLID; - struct State_EatYams_Called : State - { - int m_Overload; - State_EatYams_Called(int ovrld) : m_Overload(ovrld) - { - } - bool IsEqual(State *other) - { - State_EatYams_Called *other2 = dynamic_cast(other); - if (!other2) - return false; - return other2->m_Overload == m_Overload; - } - }; + MAKE_STATE_1(State_EatYams_Called, int); + MAKE_STATE_1(State_EatYams_Handler_Called, int); + MAKE_STATE_2(State_Vafmt_Called, int, std::string); + MAKE_STATE_2(State_Vafmt_PreHandler_Called, int, std::string); + MAKE_STATE_2(State_Vafmt_PostHandler_Called, int, std::string); - struct State_EatYams_Handler_Called : State - { - int m_Overload; - State_EatYams_Handler_Called(int ovrld) : m_Overload(ovrld) - { - } - bool IsEqual(State *other) - { - State_EatYams_Handler_Called *other2 = dynamic_cast(other); - if (!other2) - return false; - return other2->m_Overload == m_Overload; - } - }; - - - // TEST1 - // Basic tests - // Hooking and callclass class IGaben { public: @@ -54,22 +29,63 @@ namespace ADD_STATE(State_EatYams_Called(1)); return true; } + virtual void Vafmt1(bool param1, int x, const char *fmt, ...) + { + va_list ap; + va_start(ap, fmt); + char buffer[512]; + vsprintf(buffer, fmt, ap); + va_end(ap); + ADD_STATE(State_Vafmt_Called(1, std::string(buffer))); + } + virtual float Vafmt2(const char *fmt, ...) + { + va_list ap; + va_start(ap, fmt); + char buffer[512]; + vsprintf(buffer, fmt, ap); + va_end(ap); + ADD_STATE(State_Vafmt_Called(2, std::string(buffer))); + return 0.0f; + } }; SH_DECL_HOOK0_void(IGaben, EatYams, SH_NOATTRIB, 0); SH_DECL_HOOK1(IGaben, EatYams, const, 1, bool, const char *); + SH_DECL_HOOK2_void_vafmt(IGaben, Vafmt1, SH_NOATTRIB, 0, bool, int); + SH_DECL_HOOK0_vafmt(IGaben, Vafmt2, SH_NOATTRIB, 0, float); + + void EatYams0_Handler() + { + ADD_STATE(State_EatYams_Handler_Called(0)); + } + + bool EatYams1_Handler(const char *loc) + { + ADD_STATE(State_EatYams_Handler_Called(1)); + return true; + } + + void Vafmt1_PreHandler(bool param1, int x, const char *in) + { + ADD_STATE(State_Vafmt_PreHandler_Called(1, std::string(in))); + } + void Vafmt1_PostHandler(bool param1, int x, const char *in) + { + ADD_STATE(State_Vafmt_PostHandler_Called(1, std::string(in))); + } + float Vafmt2_PreHandler(const char *in) + { + ADD_STATE(State_Vafmt_PreHandler_Called(2, std::string(in))); + return 0.0f; + } + float Vafmt2_PostHandler(const char *in) + { + ADD_STATE(State_Vafmt_PostHandler_Called(2, std::string(in))); + return 0.0f; + } } -void EatYams0_Handler() -{ - ADD_STATE(State_EatYams_Handler_Called(0)); -} - -bool EatYams1_Handler(const char *loc) -{ - ADD_STATE(State_EatYams_Handler_Called(1)); - return true; -} bool TestVafmtAndOverload(std::string &error) { @@ -82,6 +98,7 @@ bool TestVafmtAndOverload(std::string &error) SourceHook::CallClass *cc = SH_GET_CALLCLASS(pGab); + // Part 1 SH_CALL(cc, static_cast(&IGaben::EatYams))(); SH_CALL(cc, static_cast(&IGaben::EatYams))("Here!"); @@ -103,6 +120,52 @@ bool TestVafmtAndOverload(std::string &error) new State_EatYams_Called(1), NULL),"Part 1"); + // Part 2 + pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); + SH_CALL(cc, &IGaben::Vafmt1)(true, 55, "Hello %s%d%s", "BA", 1, "L"); + pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); + SH_CALL(cc, &IGaben::Vafmt2)("Hello %s%d%s", "BA", 1, "LOPAN"); + + CHECK_STATES((&g_States, + new State_Vafmt_Called(1, "Hello BA1L"), + new State_Vafmt_Called(1, "Hello BA1L"), + new State_Vafmt_Called(2, "Hello BA1LOPAN"), + new State_Vafmt_Called(2, "Hello BA1LOPAN"), + NULL), "Part 2"); + + // Part 3 + SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); + SH_ADD_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); + SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); + SH_ADD_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); + + pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); + pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); + + CHECK_STATES((&g_States, + new State_Vafmt_PreHandler_Called(1, std::string("Hello BA1L")), + new State_Vafmt_Called(1, std::string("Hello BA1L")), + new State_Vafmt_PostHandler_Called(1, std::string("Hello BA1L")), + + new State_Vafmt_PreHandler_Called(2, std::string("Hello BA1LOPAN")), + new State_Vafmt_Called(2, std::string("Hello BA1LOPAN")), + new State_Vafmt_PostHandler_Called(2, std::string("Hello BA1LOPAN")), + NULL), "Part 3"); + + // Part 4 + SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PreHandler, false); + SH_REMOVE_HOOK(IGaben, Vafmt1, pGab, Vafmt1_PostHandler, true); + SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PreHandler, false); + SH_REMOVE_HOOK(IGaben, Vafmt2, pGab, Vafmt2_PostHandler, true); + + pGab->Vafmt1(true, 55, "Hello %s%d%s", "BA", 1, "L"); + pGab->Vafmt2("Hello %s%d%s", "BA", 1, "LOPAN"); + + CHECK_STATES((&g_States, + new State_Vafmt_Called(1, "Hello BA1L"), + new State_Vafmt_Called(2, "Hello BA1LOPAN"), + NULL), "Part 4"); + SH_RELEASE_CALLCLASS(cc); return true; diff --git a/sourcehook/test/testevents.h b/sourcehook/test/testevents.h index 781b899..4006efa 100644 --- a/sourcehook/test/testevents.h +++ b/sourcehook/test/testevents.h @@ -72,5 +72,28 @@ namespace #define CHECK_STATES(mwah, myerr) if (!StatesOk mwah) { error=myerr; return false; } +#define MAKE_STATE(name) struct name : State {}; +#define MAKE_STATE_1(name, p1_type) struct name : State { \ + p1_type m_Param1; \ + name(p1_type param1) : m_Param1(param1) {} \ + virtual bool IsEqual(State *other) { \ + name *other2 = dynamic_cast(other); \ + if (!other2) \ + return false; \ + return other2->m_Param1 == m_Param1;\ + } \ + } + +#define MAKE_STATE_2(name, p1_type, p2_type) struct name : State { \ + p1_type m_Param1; \ + p2_type m_Param2; \ + name(p1_type param1, p2_type param2) : m_Param1(param1), m_Param2(param2) {} \ + virtual bool IsEqual(State *other) { \ + name *other2 = dynamic_cast(other); \ + if (!other2) \ + return false; \ + return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2;\ + } \ + } #endif