the GCC (3.2.2) compiler will not let me declare an __stdcall__ pointer to function member and code will than SEGFAULT on invocation of the member pointer. This is not the case for Regular pointers to functions. ( The compiler will also issue a warning on mismatch.)
Listing of the Error: (BAD)
class AFoo { public: __attribute__((__stdcall__)) void foo(int i ,int ii ,int iii) ; } ;
__attribute__((__stdcall__)) void AFoo::foo(int i ,int ii ,int iii) { return ; }
int main() { AFoo afoo ; void ( AFoo::*func)(int,int,int) ; func = &AFoo::foo ;
for(int i=0 ; i < 0x8000000 ;i++) (afoo.*func)(1,2,3) ; // SEGFAULT or SEGIL when stack is Exhausted return 0 ; }
any attempt to place the __atribute__((stdcall)) in the pointer declaration causes a compilation error. With out it the code will SEGFAULT.
If declaring a regular pointer to function than no compilation error is issued and all is well.
Listing of Regular function pointer: (GOOD)
void __attribute__((stdcall)) foo(int i ,int ii ,int iii) { }
int main() { void ( __attribute__((stdcall)) *func)(int,int,int) = &foo ;
for(int i=0 ; i < 0x8000000 ;i++) (func)(1,2,3) ;
return 0 ; }
removing the __attribute__((stdcall)) from the *func declaration will rightfully issue a warning ( should be an error if you ask me, type mismatch). But Not so on our first example.
!!!!!!!!!!!!!!!!!! Please if any body can help me? This totaly breaks COM. Is there a GCC switch to have all members (and pointers)__stdcall, to by pass this problem?
Free Life Boaz
OK for now I can use -mrtd on the GCC command-line. This will render all code to use __stdcall, including the function pointers. This can be dangerous with external libraries that where not compiled with this switch and have no explicit function prototype.
- Quick browse of GCC stdlib headers show all functions are properly prototyped. - Off course Wine headers are (binary computability WINAPI and all) - ...
[Q] Does any body know of libraries I should be careful of ? [Q] Is there a way to make the Compiler/Linker check this thing? (in a special makefile)
In C++ code there is no problems since the mangling changes so the Linker will complain of undefined symbols.
Boaz Harrosh wrote:
the GCC (3.2.2) compiler will not let me declare an __stdcall__ pointer to function member and code will than SEGFAULT on invocation of the member pointer. This is not the case for Regular pointers to functions. ( The compiler will also issue a warning on mismatch.)
Listing of the Error: (BAD)
class AFoo { public: __attribute__((__stdcall__)) void foo(int i ,int ii ,int iii) ; } ;
__attribute__((__stdcall__)) void AFoo::foo(int i ,int ii ,int iii) { return ; }
int main() { AFoo afoo ; void ( AFoo::*func)(int,int,int) ; func = &AFoo::foo ;
for(int i=0 ; i < 0x8000000 ;i++) (afoo.*func)(1,2,3) ; // SEGFAULT or SEGIL when stack is Exhausted return 0 ; }
any attempt to place the __atribute__((stdcall)) in the pointer declaration causes a compilation error. With out it the code will SEGFAULT.
If declaring a regular pointer to function than no compilation error is issued and all is well.
Listing of Regular function pointer: (GOOD)
void __attribute__((stdcall)) foo(int i ,int ii ,int iii) { }
int main() { void ( __attribute__((stdcall)) *func)(int,int,int) = &foo ;
for(int i=0 ; i < 0x8000000 ;i++) (func)(1,2,3) ;
return 0 ; }
removing the __attribute__((stdcall)) from the *func declaration will rightfully issue a warning ( should be an error if you ask me, type mismatch). But Not so on our first example.
!!!!!!!!!!!!!!!!!! Please if any body can help me? This totaly breaks COM. Is there a GCC switch to have all members (and pointers)__stdcall, to by pass this problem?
Free Life Boaz