[PATCH] msi: Use __stdcall instead of the default __cdecl in IWineMsiRemote.

Zebediah Figura z.figura12 at gmail.com
Tue Aug 13 17:26:24 CDT 2019


On 8/3/19 2:17 PM, Gerald Pfeifer wrote:
> Building with clang 7 or new versions of GCC I get the loads of the
> following under dlls/msi:
> 
>    winemsi_s.c:4014:5: warning: cast between incompatible calling
>        conventions 'cdecl' and 'stdcall'; calls through this pointer
>        may abort at runtime
>        [-Wcast-calling-convention]
>      (SERVER_ROUTINE)s_remote_ViewClose,
>      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    ./winemsi.h:69:14: note: consider defining 's_remote_ViewClose'
>        with the 'stdcall' calling convention
>    UINT __cdecl s_remote_ViewClose(
>                 ^
>                 __attribute__((stdcall))
> 
> Does the approach below look proper?  If not, how would you address
> this?
> 

So, from my understanding:

* MIDL always generates functions not decorated by calling convention, 
unless one is explicitly specified (I think? I haven't tested this.)

* Microsoft says the default calling convention in C/C++ is cdecl [1], 
so the RPC runtime must presumably expect those functions to be cdecl.

* For stubless mode, I think it doesn't matter which calling convention 
is used (at least between cdecl and stdcall), since the caller can just 
clean up the stack, as we do in call_server_func().

* I don't think the server routine table is used when not using stubless 
mode. (Are we even correct to generate it in that case?)

Personally, I'm inclined to say this warning is not very useful in 
general, and should be ignored. I don't think it's any more an error to 
mismatch calling convention than, say, parameter count or type, when 
casting a function. But of course it's not my decision to make.

[1] https://docs.microsoft.com/en-us/cpp/cpp/cdecl?view=vs-2019



More information about the wine-devel mailing list