2010-02-01 2 views
3

Мой проект настроен таким образом, что весь код и модули структуры скомпилированы в статический .lib (давайте назовем его framework.lib), а многие тестовые проекты используют framework.lib и скомпилируют исполняемые файлы.LoadString, статическая библиотека и исполняемые файлы

Для обработки ошибок, я пытаюсь поместить строки ресурсов в framework.rc (часть проекта framework.lib) и загрузить строки в исполняемые файлы. Однако LoadString() просто терпит неудачу. Использование GetLastError()/FormatMessage() Я получаю следующее сообщение:

«Указанный тип ресурса не может быть найден в файле изображения».

Вот как я называю LoadString, который возвращает 0:

char szString[256]; 
int iNbOfChars = LoadStringA(GetModuleHandle(NULL), iStringID, szString, 256); 

Если то, что я бы неудачу, потому что ресурс не определен в приложении, но в Lib? Если да, то любые предложения, чтобы я мог иметь централизованный файл ресурсов?

ответ

3

Статические библиотеки - это просто конкатенации файлов .OBJ - у них нет таких функций, как ресурсы. Для этого вам нужно поместить ресурсы в DLL.

+1

+1. Просто не забудьте изменить «GetModuleHandle (NULL)» на правильный целевой таргетинг на вашу Dll. –

0

Вы можете использовать директиву #include в файле ресурсов приложения, чтобы включить файл ресурсов библиотеки.

Ресурсы разрешены только на уровне выходного (EXE) и не могут быть встроены в .Lib.

0

AFAIK вы не можете добавлять ресурсы в статическую библиотеку - вам нужно либо скомпилировать их в DLL для совместного использования, либо непосредственно в приложение.

Вы можете поделиться .rc из центрального местоположения и скомпилировать его в самом приложении.

1

Вы не можете поместить ресурсы в .lib-файлы. (Надеюсь ты мог бы). Вы должны хранить файлы .rc и включать их в файл .rc приложения, когда вы ссылаетесь на lib.

И из-за этого вы должны убедиться, что ни один из идентификаторов ресурса, используемых в .lib, также не используется приложением. Это беспорядок, но нет лучшего решения, если вы используете .rc-файлы для своих строк. и придерживаться инструментов Microsoft.

Около двух лет назад я настолько расстроен этим ограничением, что я ушел и создал инструмент, который превратил скомпилированный файл ресурсов (.res) в .obj-файл, поэтому я мог бы включить его в мою библиотеку lib , Конечно, когда вы это делаете, вы больше не можете использовать LoadString, но получается, что писать собственный код для синтаксического анализа данных .res и найти строки на самом деле не так сложно. Таким образом, мое текущее решение поставить строки в библиотеках

  • создать framework.rc
  • скомпилировать его в framework.res
  • поворота framework.res в framework.obj, который содержит внешние символы

    const BYTE framework_res[]; const size_t framework_res_size;

  • MyLoadString(framework_res, framework_res_size, iStringId, sz, 256) вместо LoadString при извлечении строк в libra гу.

Одним из преимуществ делают это таким образом, оказалось, что, когда я писал свою собственную LoadString, я мог бы вернуть указатель на строку ресурса, а не копировать его. поэтому моя фактическая функция LoadString выглядит так.

LPCWSTR MyFindString(framework_res, framework_res_size, iStringId);

Если скомпилировать файл .rc с/п вариант, он будет обнулить прекратить все строки.

0

Очевидным способом централизовать ресурсы было бы создание библиотеки DLL, содержащей ресурсы. Затем вы можете использовать LoadString и такие, как если бы ресурс находился в исполняемом файле, за исключением мелких деталей, которые вам нужно указать верным дескриптором модуля вместо NULL.

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