widl: In 64-bit mode, pass all arguments to NdrClientCall instead of a pointer to the first one.

This commit is contained in:
Alexandre Julliard 2011-06-08 11:34:46 +02:00
parent 5bf7622fc3
commit d9cd0d8cac
2 changed files with 26 additions and 7 deletions

View file

@ -107,15 +107,25 @@ static void write_function_stub( const type_t *iface, const var_t *func,
fprintf(client, "{\n");
indent++;
if (has_ret) print_client( "%s", "CLIENT_CALL_RETURN _RetVal;\n\n" );
print_client( "%s%s( &%s_StubDesc, &__MIDL_ProcFormatString.Format[%u], ",
print_client( "%s%s( &%s_StubDesc, &__MIDL_ProcFormatString.Format[%u]",
has_ret ? "_RetVal = " : "",
stub_mode == MODE_Oif ? "NdrClientCall2" : "NdrClientCall",
iface->name, proc_offset );
if (args)
fprintf( client, "(unsigned char *)&%s );\n",
LIST_ENTRY( list_head(args), const var_t, entry )->name );
else
fprintf( client, "(unsigned char *)0 );\n" );
{
const var_t *arg;
if (pointer_size == 8)
{
LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
fprintf( client, ",\n%*s%s", 4 * indent + 16, "", arg->name );
}
else
{
arg = LIST_ENTRY( list_head(args), const var_t, entry );
fprintf( client, ", &%s", arg->name );
}
}
fprintf( client, " );\n" );
if (has_ret)
{
print_client( "return (" );

View file

@ -280,11 +280,20 @@ static void gen_proxy(type_t *iface, const var_t *func, int idx,
print_proxy( "{\n");
indent++;
if (has_ret) print_proxy( "%s", "CLIENT_CALL_RETURN _RetVal;\n\n" );
print_proxy( "%s%s( &Object_StubDesc, &__MIDL_ProcFormatString.Format[%u], ",
print_proxy( "%s%s( &Object_StubDesc, &__MIDL_ProcFormatString.Format[%u],",
has_ret ? "_RetVal = " : "",
stub_mode == MODE_Oif ? "NdrClientCall2" : "NdrClientCall",
proc_offset );
fprintf( proxy, "(unsigned char *)&This );\n" );
if (pointer_size == 8)
{
const var_t *arg;
fprintf( proxy, "\n%*sThis", 4 * indent + 16, "" );
if (args)
LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
fprintf( proxy, ",\n%*s%s", 4 * indent + 16, "", arg->name );
}
else fprintf( proxy, " &This" );
fprintf( proxy, " );\n" );
if (has_ret)
{
print_proxy( "return (" );