MFC - расширение в ручную
Может кто-нибудь предоставить объяснение или ссылку, которая объясняет, как именно STRINGTABLE в файле ресурсов MFC определяется и может быть расширен вручную?
Я пытался сделать это, но не смог сделать это в многопроектном решении. Большинство проектов в указанном решении имеют свои собственные файлы ресурсов и переименованы в resource.h-файлы.
Когда приложение пытается получить доступ к строковым ресурсам, появляется сообщение об ошибке "Строка ресурса для" 22392 "не найдена". 22392 - это идентификатор строки, которую я пытался создать. Я не получаю похожее сообщение об ошибке, если вместо этого использую уже определенный идентификатор строки.
Использование мастера Visual Studio 2010 для добавления строкового ресурса также не работало. Но это правильно отображается в списке символов ресурсов и в редакторе таблицы строк.
Излишне говорить, что я не участвовал в создании этого решения.
Спасибо за вашу помощь.
[EDIT1]
Я исключил возможность конфликта, выполнив "поиск в файлах" для использованного значения, а также используя другие значения: 22390, 22391, 22393, 22394, 22395. Всегда получал один и тот же результат.
[EDIT2]
Я повторил шаги, которые я сделал в комплексном решении, в новом, простом и понятном приложении MFC с одним проектом, и оно работало без проблем. Поэтому я предполагаю, что моя проблема связана с тем, что решение имеет несколько проектов и ресурсов.
Шаги были следующие:
- Выберите свободный номер в файле resource.h (в моем случае он называется по-другому) и добавьте бесплатный номер#define IDS_XXX.
- Подтвердите выбранный номер, выполнив с ним поиск в файлах.
Добавьте строку в STRINGTABLE в resource.h, предпочтительно близко к IDS_ со значением, близким к выбранному мной.
STRINGTABLE BEGIN IDS_OTHER "I have a number close to XXX" IDS_XXX "HelloHello" END
Доступ к строке в приложении:
CString strMyString; strMyString.LoadString(IDS_XXX); AfxMessageBox(strMyString, MB_YESNO | MB_ICONEXCLAMATION);
[EDIT3]
Я попытался найти вызов LoadString, который вызывает сообщение об ошибке. LoadString, которая не может загрузить мой строковый ресурс, находится в классе, который находится в том же проекте, что и файл ресурсов (.rc), содержащий указанный строковый ресурс. Там генерируется сообщение об ошибке "Строка ресурса для" 22392 "не найдена". Это объясняет, по крайней мере, почему я не нашел ничего, чтобы погуглить это.
[EDIT4]
Я мог бы выделить причину дальше.
В cstringt.h hInst равен NULL, иначе не может быть найден ресурс строки:
_Check_return_ BOOL LoadString(_In_ UINT nID)
{
HINSTANCE hInst = StringTraits::FindStringResourceInstance( nID );
if( hInst == NULL )
{
return( FALSE ); // goes here, but shouldn't, hInst == NULL
}
return( LoadString( hInst, nID ) );
}
Это странно, так как возможно получить доступ к другому строковому ресурсу в том же файле ресурсов.
2 ответа
Ошибка "Строка ресурса для" 22392 "не найдена" звучит так, будто Windows не может найти эту конкретную строку в таблице строк, хотя это противоречит вашему утверждению "но оно правильно отображается в списке символов ресурсов и в редакторе таблицы строк". Несколько вещей, которые я хотел бы сделать или проверить, чтобы сузить проблему:
- Очистить / восстановить весь проект и / или решение. Я видел слишком много странного поведения VS только из-за плохих или устаревших сборок, что обычно это первое, что я пробую.
- Отредактируйте файл RC в текстовом редакторе: щелкните правой кнопкой мыши файл RC и выберите "View Code" в VS2010. Убедитесь, что строка 22392 действительно присутствует и действительна. Проверьте записи до и после него.
- Удалите строку из таблицы строк и resource.h. Повторно создайте строку из редактора ресурсов.
- Вы упоминаете "переименованные файлы resource.h". Я не совсем уверен, что вы имеете в виду, но убедитесь, что они правильно используются в файле RC: они должны быть включены вверху, когда вы смотрите на это в текстовом редакторе.
- Убедитесь, что определенное имя для 22392 не переопределено где-то еще в проекте.
Если строка присутствует в таблице строк и вы все еще получаете ошибку "not found", то происходит что-то еще.
Определения для идентификаторов присутствуют в Resource.h. Возможно, кто-то мог добавить строку и удалить запись в Resource.h, поэтому он показывает вам сообщение об ошибке. Откройте resource.h и добавьте #define IDS_XXX 22392