mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-21 11:34:12 +00:00
sxs: Return correct path from IAssemblyCache::QueryAssemblyInfo().
Some applications call IAssemblyCache::QueryAssemblyInfo(), then append DLL name to the returned path, and call GetFileAttributes() to check DLL existence. Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
43f822bca2
commit
c460d4ff35
|
@ -122,23 +122,22 @@ static WCHAR *build_assembly_name( const WCHAR *arch, const WCHAR *name, const W
|
|||
return wcslwr( ret );
|
||||
}
|
||||
|
||||
static WCHAR *build_manifest_path( const WCHAR *arch, const WCHAR *name, const WCHAR *token,
|
||||
const WCHAR *version )
|
||||
static WCHAR *build_dll_path( const WCHAR *arch, const WCHAR *name, const WCHAR *token,
|
||||
const WCHAR *version )
|
||||
{
|
||||
static const WCHAR fmtW[] =
|
||||
{'%','s','m','a','n','i','f','e','s','t','s','\\','%','s','.','m','a','n','i','f','e','s','t',0};
|
||||
WCHAR *path = NULL, *ret, sxsdir[MAX_PATH];
|
||||
unsigned int len;
|
||||
|
||||
if (!(path = build_assembly_name( arch, name, token, version, &len ))) return NULL;
|
||||
len += ARRAY_SIZE(fmtW);
|
||||
len += build_sxs_path( sxsdir );
|
||||
len += build_sxs_path( sxsdir ) + 1;
|
||||
if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, path );
|
||||
return NULL;
|
||||
}
|
||||
swprintf( ret, len, fmtW, sxsdir, path );
|
||||
lstrcpyW( ret, sxsdir );
|
||||
lstrcatW( ret, path );
|
||||
lstrcatW( ret, L"\\" );
|
||||
HeapFree( GetProcessHeap(), 0, path );
|
||||
return ret;
|
||||
}
|
||||
|
@ -202,7 +201,7 @@ static HRESULT WINAPI cache_QueryAssemblyInfo(
|
|||
struct cache *cache = impl_from_IAssemblyCache( iface );
|
||||
IAssemblyName *name_obj;
|
||||
const WCHAR *arch, *name, *token, *type, *version;
|
||||
WCHAR *p, *path = NULL;
|
||||
WCHAR *path = NULL;
|
||||
unsigned int len;
|
||||
HRESULT hr;
|
||||
|
||||
|
@ -232,7 +231,7 @@ static HRESULT WINAPI cache_QueryAssemblyInfo(
|
|||
}
|
||||
cache_lock( cache );
|
||||
|
||||
if (!wcscmp( type, win32W )) path = build_manifest_path( arch, name, token, version );
|
||||
if (!wcscmp( type, win32W )) path = build_dll_path( arch, name, token, version );
|
||||
else if (!wcscmp( type, win32_policyW )) path = build_policy_path( arch, name, token, version );
|
||||
else
|
||||
{
|
||||
|
@ -250,7 +249,6 @@ static HRESULT WINAPI cache_QueryAssemblyInfo(
|
|||
info->dwAssemblyFlags = ASSEMBLYINFO_FLAG_INSTALLED;
|
||||
TRACE("assembly is installed\n");
|
||||
}
|
||||
if ((p = wcsrchr( path, '\\' ))) *p = 0;
|
||||
len = lstrlenW( path ) + 1;
|
||||
if (info->pszCurrentAssemblyPathBuf)
|
||||
{
|
||||
|
|
|
@ -162,6 +162,8 @@ static void test_QueryAssemblyInfo( void )
|
|||
ok( !info.uliAssemblySizeInKB.u.LowPart, "got %u\n", info.uliAssemblySizeInKB.u.LowPart );
|
||||
ok( info.cchBuf == ARRAY_SIZE( path ), "got %u\n", info.cchBuf );
|
||||
ok( path[0], "empty path\n" );
|
||||
lstrcatW( path, L"comctl32.dll" );
|
||||
ok( GetFileAttributesW( path ) != INVALID_FILE_ATTRIBUTES, "%s should exist\n", wine_dbgstr_w( path ));
|
||||
|
||||
memset( &info, 0, sizeof(info) );
|
||||
info.cbAssemblyInfo = sizeof(info);
|
||||
|
|
Loading…
Reference in a new issue