Maarten Lankhorst wrote:
It looks evil, and those functions are not exactly what I want, because I need them in a vtable, which requires them to be something like HRESULT ... fnTextServ_blah(ITextServices *iface, args), I could recast those functions, but that is not exactly a 'clean' solution, adding 'thiscall' to gcc would definitely help a lot. Until gcc supports thiscall, I think it would be easier to just fix the macro's I already have and set attribute 'used' to avoid compiler warnings. But I still wonder what I have to do to call a 'thiscall' function, since I probably need it in ITextHost.
With those (evil) macros you could do:
#define CALL_THISCALL0(name,this) __thiscall_#name(0,0,this) #define CALL_THISCALL1(name,this,p1) __thiscall_#name(0,0,this,p1)
If you wanna use the same technique as used in MSVCRT you would do something like:
#define STDCALL(func) __stdcall_ ## func #define STDCALL_NAME(func) __ASM_NAME("__stdcall_" #func) #define DEFINE_STDCALL_WRAPPER(func) \ extern void STDCALL(func)(); \ __ASM_GLOBAL_FUNC(__stdcall_ ## func, \ "popl %eax\n\t" \ "popl %ecx\n\t" \ "pushl %eax\n\t" \ "jmp " __ASM_NAME(#func) )
Now you can do:
void WINAPI foo(int a, int b);
DEFINE_STDCALL_WRAPPER(foo);
int bar() { __stdcall_foo(1,2,3); }
Thinking up better macro-names is left as an exercise for the reader. :)
Felix