On Tue, 2011-10-11 at 13:20 +0200, Bernhard Loos wrote: +static HRESULT get_action_info( msi_custom_action_info *info, INT *type, + BSTR *source, BSTR *target, BSTR *name, + IWineMsiRemotePackage **package ) { - IClassFactory *cf = NULL; - IWineMsiRemoteCustomAction *rca = NULL; - HRESULT r; - - r = DllGetClassObject( &CLSID_WineMsiRemoteCustomAction, - &IID_IClassFactory, (LPVOID *)&cf ); - if (FAILED(r)) - { - ERR("failed to get IClassFactory interface\n"); - return ERROR_FUNCTION_FAILED; - } - - r = IClassFactory_CreateInstance( cf, NULL, &IID_IWineMsiRemoteCustomAction, (LPVOID *)&rca ); - if (FAILED(r)) - { - ERR("failed to get IWineMsiRemoteCustomAction interface\n"); - return ERROR_FUNCTION_FAILED; - } - - r = IWineMsiRemoteCustomAction_GetActionInfo( rca, guid, type, handle, dll, funcname, package ); - IWineMsiRemoteCustomAction_Release( rca ); - if (FAILED(r)) - { - ERR("GetActionInfo failed\n"); - return ERROR_FUNCTION_FAILED; + IWineMsiRemotePackage *rp; + HRESULT res; + *source = *target = *name = NULL; + + res = create_msi_remote_package( NULL, (void **) &rp ); + if (FAILED( res )) + return res; + res = IWineMsiRemotePackage_SetMsiHandle( rp, alloc_msihandle( &info->package->hdr ) );
You should check for failure from alloc_msihandle.
+ if (FAILED( res )) + goto error; + + *source = SysAllocString( info->source ); + *target = SysAllocString( info->target ); + *name = SysAllocString( info->action ); + if (!*source || !*target || !*name) { + res = E_OUTOFMEMORY; + goto error; } - + + *package = rp; + *type = info->type; + return ERROR_SUCCESS;
This should become S_OK. You are mixing up return types in more places.