HRSRC Resource::findResource() const {
LPCTSTR id = namePtr; // string resources are stored in blocks (stringtables) // id of the resource is (stringId / 16 + 1) if (typePtr == RT_STRING) {
id = MAKEINTRESOURCE(UINT(size_t(id) / 16 + 1));
} return FindResource(instance, id, typePtr);
}
LPVOID Resource::getPtr(DWORD &size) const
{ // LoadString returns the same result if value is zero-length or // if if the value does not exists, // so we need to ensure the stringtable exists
HRSRC resInfo = findResource(); if (resInfo == NULL) {
JP_THROW(SysError(getErrMsg("cannot find resource"), FindResource));
}
HGLOBAL res = LoadResource(instance, resInfo); if (res == NULL) {
JP_THROW(SysError(getErrMsg("cannot load resource"), LoadResource));
}
if (typePtr == RT_STRING) { // string resources are stored in stringtables and // need special handling // The simplest way (while we don't need handle resource locale) // is LoadString // But this adds dependency on user32.dll, // so implement custom string extraction
// number in the block (namePtr is an integer)
size_t num = size_t(namePtr) & 0xf;
LPWSTR strPtr = (LPWSTR)ptr; for (size_t i = 0; i < num; i++) { // 1st symbol contains string length
strPtr += DWORD(*strPtr) + 1;
} // *strPtr contains string length, string value starts at strPtr+1
size = DWORD(*strPtr) * sizeof(wchar_t);
ptr = strPtr+1;
} else {
size = SizeofResource(instance, resInfo);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.