Fix integer based resource id assumption.
Add support for string based type ids.
This commit is contained in:
parent
a39ad1af4b
commit
e91d976e17
|
@ -37,56 +37,56 @@ void LIBRES_RegisterResources(const wrc_resource32_t * const * Res)
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* LIBRES_FindResource
|
* LIBRES_FindResource
|
||||||
*/
|
*/
|
||||||
|
typedef int (*CmpFunc_t)(LPCWSTR a, LPCWSTR b, int c);
|
||||||
|
|
||||||
|
int CompareOrdinal(LPCWSTR ordinal, LPCWSTR resstr, int resid)
|
||||||
|
{
|
||||||
|
return !resstr && (resid == LOWORD(ordinal));
|
||||||
|
}
|
||||||
|
|
||||||
|
int CompareName(LPCWSTR name, LPCWSTR resstr, int resid)
|
||||||
|
{
|
||||||
|
return resstr && !CRTDLL__wcsnicmp(resstr+1, name, *(resstr));
|
||||||
|
}
|
||||||
|
|
||||||
HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
|
HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCWSTR name, LPCWSTR type )
|
||||||
{
|
{
|
||||||
int nameid=0,typeid;
|
LPCWSTR nameid = name, typeid = type;
|
||||||
ResListE* ResBlock;
|
ResListE* ResBlock;
|
||||||
const wrc_resource32_t* const * Res;
|
const wrc_resource32_t* const * Res;
|
||||||
|
CmpFunc_t EqualNames = CompareOrdinal;
|
||||||
|
CmpFunc_t EqualTypes = CompareOrdinal;
|
||||||
|
|
||||||
if(HIWORD(name))
|
if(HIWORD(name))
|
||||||
{
|
{
|
||||||
if(*name=='#')
|
if(*name=='#')
|
||||||
{
|
{
|
||||||
LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
|
LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
|
||||||
nameid = atoi(nameA+1);
|
nameid = (LPCWSTR) atoi(nameA+1);
|
||||||
HeapFree( GetProcessHeap(), 0, nameA );
|
HeapFree( GetProcessHeap(), 0, nameA );
|
||||||
name=NULL;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
EqualNames = CompareName;
|
||||||
nameid=LOWORD(name);
|
|
||||||
name=NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(HIWORD(type))
|
if(HIWORD(type))
|
||||||
{
|
{
|
||||||
if(*type=='#')
|
if(*type=='#')
|
||||||
{
|
{
|
||||||
LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
|
LPSTR typeA = HEAP_strdupWtoA( GetProcessHeap(), 0, type );
|
||||||
typeid=atoi(typeA+1);
|
typeid= (LPCWSTR) atoi(typeA+1);
|
||||||
HeapFree( GetProcessHeap(), 0, typeA );
|
HeapFree( GetProcessHeap(), 0, typeA );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
EqualTypes = CompareName;
|
||||||
TRACE("(*,*,type=string): Returning 0\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
typeid=LOWORD(type);
|
|
||||||
|
|
||||||
/* FIXME: types can be strings */
|
|
||||||
for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
|
for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
|
||||||
for(Res=ResBlock->Resources; *Res; Res++)
|
for(Res=ResBlock->Resources; *Res; Res++)
|
||||||
if(name)
|
if (EqualNames(nameid, (*Res)->resname, (*Res)->resid) &&
|
||||||
{
|
EqualTypes(typeid, (*Res)->restypename, (*Res)->restype))
|
||||||
if((*Res)->restype==typeid &&
|
|
||||||
!CRTDLL__wcsnicmp((LPCWSTR)((*Res)->resname+1), name, *((*Res)->resname)))
|
|
||||||
return (HRSRC)*Res;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
if((*Res)->restype==typeid && (*Res)->resid==nameid)
|
|
||||||
return (HRSRC)*Res;
|
return (HRSRC)*Res;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue