Встраивание нескольких файлов ресурсов с одинаковыми именами (RC) в собственную DLL - PullRequest
2 голосов
/ 30 июня 2009

Для моего приложения (оснастка MMC) мне нужно создать одну собственную DLL-библиотеку, содержащую строки, которые локализованы на разные языки. Другими словами, если бы вы проверяли эту DLL с помощью Visual Studio, вы бы увидели несколько строковых таблиц, каждая из которых связана с разным языковым стандартом, но содержит одинаковые строковые идентификаторы.

Подход, который я хотел бы использовать, состоит в том, чтобы иметь подкаталоги в моем каталоге проектов, такие как "de", "en", "es" и т. Д. (Т. Е. По одному для каждого языка). Внутри каждого подкаталога будет находиться файл с именем «Resources.rc», который будет RC-файлом, содержащим строки для этого языка. Наличие моих ресурсов в этой структуре было бы идеально для команды локализации.

Мне удалось создать свои различные RC-файлы и добавить их в мой проект Visual C ++. Все они правильно отображаются в обозревателе решений в Visual Studio (в основном вы видите пять экземпляров записи с именем «Resource.rc», но каждая запись указывает на отдельный файл).

Проблема заключается в создании моего проекта. Кажется, что только один из файлов RC (тот, который указан первым в файле vcproj) скомпилирован в файл RES и включен в мою DLL. Предположительно, это связано с тем, что Visual Studio не нравится тот факт, что все RC-файлы имеют одинаковые имена.

Есть ли способ добиться того, чего я хочу?

Спасибо!

1 Ответ

2 голосов
/ 30 июня 2009

Да. И нет. Если вам нужно несколько RC-файлов, вам придется использовать поддержку операционных систем, чтобы иметь несколько ресурсов в одном файле. В редакторе ресурсов для каждого ресурса вы можете установить его локаль И редактор ресурсов позволит вам иметь несколько ресурсов с одинаковым идентификатором, если их локаль отличается.

Итак, ваш первый шаг - отредактировать каждый из файлов RC, чтобы убедиться, что ресурсы в одном - английский / американский, в другом - французский и т. Д.

Далее, получите основной RC-файл, чтобы #include остальные.

Наконец, и это проблема, вам нужно полагаться на логику операционных систем для загрузки правильных ресурсов. Если вы хотите, чтобы локаль ПК определяла, какой язык интерфейса используется, то вы уже достаточно.

Если вы хотите предоставить опцию меню, позволяющую пользователям менять языки: SetThreadLocale использовал , чтобы быть простым способом переключения локали загруженных ресурсов в текущем потоке. Начиная с Windows 2000, некоторые из-за неудачного перегруженного использования API заставили MS отказаться от его использования в пользу требования разработчиков приложений всегда использовать FindResourceEx - что на самом деле не помогает, например, для загрузки строки из таблицы строк .

Если вам действительно нужен простой способ выбрать язык пользовательского интерфейса, выбираемый пользователем, тогда вам понадобится , чтобы поместить каждый из ваших файлов .rc в отдельную DLL. а затем LoadLibrary на соответствующий языковой ресурс DLL.

...