2012-03-09 2 views
1

Может ли кто-нибудь дать объяснение или ссылку, объясняющую, как именно STRINGTABLE в файле ресурсов MFC определен и может быть вручную расширен?MFC - Вручную развернуть stringtable

Я попытался это сделать, но не смог сделать это в многопроектном решении. Большинство проектов в упомянутом решении имеют свои собственные файлы ресурсов и переименованы в файлы resource.h.

Когда приложение пытается получить доступ к строковым ресурсам, появляется сообщение об ошибке «Строка ресурсов для« 22392 «не найдена». 22392 - это идентификатор строки, которую я пытался создать. Я не получаю подобное сообщение об ошибке, если вместо этого использую уже определенный идентификатор строки.

Использование мастера Visual Studio 2010 для добавления ресурса строки также не работает. Но он корректно отображается в списке символов ресурса и в редакторе таблицы строк.

Излишне говорить, что я не участвовал в создании этого решения.

Благодарим за помощь.

[EDIT1]

я исключил возможность конфликта путем выполнения «найти в файлах» для значения, используемого и при использовании других значений, а также: 22390, 22391, 22393, 22394, 22395. Всегда есть тот же результат.

[EDIT2]

я повторил шаги, которые я сделал в комплексном решении в новом, чистом и простое приложение MFC с одним проектом, и она работала без проблем. Поэтому я полагаю, что моя проблема связана с тем, что решение имеет несколько проектов и ресурсов.

шаги были следующие:

  1. Выберите свободный номер в resource.h (который называется по-разному в моем случае) и добавьте #define IDS_XXX свободный номер.
  2. Подтвердите выбранное число, выполнив с ним «найти в файлах».
  3. Добавьте строку в STRINGTABLE в resource.h, желательно рядом с IDS_ со значением, близким к тому, которое я выбрал.

    STRINGTABLE 
    BEGIN 
        IDS_OTHER   "I have a number close to XXX" 
        IDS_XXX   "HelloHello" 
    END 
    
  4. Доступ строка в программе:

    CString strMyString; 
    strMyString.LoadString(IDS_XXX); 
    AfxMessageBox(strMyString, MB_YESNO | MB_ICONEXCLAMATION); 
    

[EDIT3]

Я пытался найти вызов LoadString, который вызывает сообщение об ошибке. LoadString, который не загружает мой строковый ресурс, находится в классе, который находится в том же проекте, что и файл ресурсов (.rc), содержащий указанный ресурс строки. Здесь генерируется сообщение об ошибке «Строка ресурсов для« 22392 »не найдена». Это объясняет, по крайней мере, почему я не нашел ничего такого.

[EDIT4]

я мог бы изолировать причину дальше.

В cstringt.h hInst является NULL аки строки Ressource не может быть найден:

_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)); 
} 

Это странно, так как можно получить доступ к другой строке Ressource в пределах одного файла ресурса просто отлично.

+0

Есть варианты запуска нумерации ресурсов, и я использовал их некоторое время назад для обработки набора DLL-расширений MFC. Я думаю, что они были в вариантах/ресурсах ... Извините, что у меня нет MSVC с MFC ... – CapelliC

+0

@chac: Если вы предлагаете изменить существующую нумерацию ресурсов, это не может быть и речи , так как решение находится в разработке уже более десятилетия, и весь ад сломается, если я попробую что-то подобное. –

ответ

1

Ошибка «строка ресурса для« 22392 «не найдена», поскольку Windows не может найти эту конкретную строку в таблице строк, хотя это конфликтует с вашим утверждением «но она появляется правильно в списке символов ресурса и в редакторе таблицы строк ». Несколько вещей, которые я хотел бы сделать или проверить, чтобы сузить выпуск:

  • Очистить/перестроить весь проект и/или решение. Я видел слишком много странного поведения от VS только из-за плохой или устаревшей сборки, что это, как правило, первое, что я пробую.
  • Редактирование файла RC в текстовом редакторе: щелкните правой кнопкой мыши файл RC и «Просмотреть код» в VS2010. Подтвердите, что строка 22392 действительно присутствует и действительна. Проверьте записи до и после нее.
  • Удалить строку из таблицы строк и resource.h. Повторно создайте строку из редактора ресурсов.
  • Вы упомянули «переименовали файлы resource.h». Я не совсем уверен, что вы имеете в виду, но убедитесь, что они правильно используются в файле RC: они должны быть включены сверху, если смотреть на них в текстовом редакторе.
  • Убедитесь, что определенное имя для 22392 не переопределено где-то еще в проекте.

Если строка присутствует в таблице строк, и вы все равно получаете ошибку «не найден», тогда происходит что-то еще.

+0

Перестройка, которая заняла час, сделала трюк. Спасибо, ты спас мне много неприятностей. –

+2

Рад, что это сработало. У меня никогда не было проблем в предыдущих версиях, но VS2010 регулярно испортил сборки и не обнаруживает, какие файлы нужно перестраивать после изменения файла.Я не знаю точно, как и почему это происходит, но мой первый шаг сейчас, когда я вижу «странные» ошибки, - это полная перестройка. Это отстой для крупных проектов, но я бы предпочел потратить час, чтобы компьютер перестроил, чем час, пытаясь отследить ошибку, которая не существует. – uesp

0

Определения для идентификаторов представлены в Resource.h. Вероятно, кто-то мог бы добавить строку и удалить запись в Resource.h, поэтому он показывает вам сообщение об ошибке. Откройте ресурс.h и добавьте #define IDS_XXX 22392

+0

Соответствующий Resource.h имеет другое имя, и именно там я уже добавил свой #define IDS_XXX 22392. Если я удалю эту строку, решение не будет компилировать: uneclared identifier. Поэтому компилятор заметил #define. Я предполагаю, что у программы есть проблема с использованием моего пользовательского идентификатора во время выполнения, любой шанс, что это связано с использованием нескольких проектов и ресурсов в этом решении? –

+0

@red_rain: Возможно, это из-за confilct. вы можете попробовать его с другим значением, отличным от 22392 – Jeeva

+0

Я исключил возможность конфликта, выполнив «поиск в файлах» для используемого значения и используя другие значения: 22390, 22391, 22393, 22394, 22395. Всегда получал тот же результат. Пожалуйста, также взгляните на мое другое редактирование на вопрос. –

Смежные вопросы