Как загрузить пользовательский двоичный ресурс в статической библиотеке VC ++ как часть библиотеки DLL? - PullRequest
16 голосов
/ 11 февраля 2012

У меня есть пользовательские двоичные ресурсы (анимированные курсоры), которые я хотел бы хранить как ресурсы в статической библиотеке в Visual Studio C ++. Оказывается, что пользовательские двоичные ресурсы не будут загружены :: LoadCursor () или найдены :: FindResource (), если это пользовательский ресурс и в статической библиотеке.

Этот вопрос дает некоторую работу вокруг.

Следуя его советам, если я добавлю файл * .res в exe-файл как «Свойство конфигурации-> Линкер-> Дополнительная зависимость», тогда статическая библиотека сможет найти ресурс.

НО, если статическая библиотека является частью библиотеки DLL и я связываю ее как дополнительную зависимость, она больше не обнаруживается!

Как я могу связать ресурсы в DLL?

Или просто сделать бинарный файл найденным в статической библиотеке? Методы в вопросе довольно громоздки.

Ответы [ 2 ]

34 голосов
/ 11 февраля 2012

В диалоговом окне «Добавить ресурс» нажмите «Импорт», выберите «Все файлы (. )», чтобы можно было импортировать файл любого типа, а затем просто выберите нужный файл.Когда появится диалоговое окно «Тип настраиваемого ресурса», введите RCDATA в поле «Тип ресурса».

Если вы откроете файл .rc, вы увидите что-то вроде этого:

/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//

IDR_RCDATA1          RCDATA               "myfile.whatever"

и он сгенерируетresource.h со следующей строкой:

#define IDR_RCDATA1                  101

В коде вы получаете к нему следующий доступ:

#include "resource.h"
#include <windows.h>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyBinaryData = ::LockResource(myResourceData);
    return 0;
}

, где pMyBinaryData - указатель на первый байт этого исполняемого файла.Для получения дополнительной информации посетите Функции ресурсов

Вот пример того, как вы должны сохранить двоичный ресурс, подобный этому, на диске:

#include "resource.h"
#include <windows.h>
#include <fstream>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyBinaryData = ::LockResource(myResourceData);

    std::ofstream f("C:\\x.bin", std::ios::out | std::ios::binary);
    f.write((char*)pMyBinaryData, myResourceSize);
    f.close();

    return 0;
}

Когда вы создаете проект с таким ресурсом,этот ресурс станет частью вашей программы (dll).

0 голосов
/ 17 июля 2019

Проблема ответа @LihO:

Первый параметр FindResource - это ModuleID модуля, содержащего ресурсы. Если установлено значение NULL , функция будет искать в созданном процессе (.exe), а не в DLL.

Но как получить HMODULE внутри статической LIB?

  • добавить функцию / параметр, которая получит HMODULE из DLL. HMODULE / HINSTANCE (то же самое) можно получить в DLLMain .
  • Попробуйте это GetCurrentModule

Edit:

См. Также: Добавить ресурс lib в библиотеку

...