__stdcall__ pointer to member function
Boaz Harrosh
boaz at hishome.net
Wed Aug 13 05:15:03 CDT 2003
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
>
>
>
>
>
More information about the wine-devel
mailing list