Подтвердить что ты не робот

Как загрузить пользовательский двоичный ресурс в статической библиотеке VС++ как часть DLL?

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

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

Следуя его совету, если я добавлю файл *.res в exe в качестве "Свойство Configuration- > Linker- > Additional Dependency", тогда статическая библиотека сможет найти ресурс.

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

Как связать ресурсы в dll?

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

4b9b3361

Ответ 1

В диалоговом окне "Добавить ресурс" нажмите "Импорт", выберите "Все файлы (.)", чтобы он мог импортировать файл любого типа, а затем просто выберите нужный файл. Когда появится диалоговое окно "Тип настраиваемого типа ресурса", введите 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).

Ответ 2

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

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

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

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

Редактировать:

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

Ответ 3

Если вы используете dll с использованием MFC (и CWinApp), вы можете получить HMODULE из CWinApp.

extern MyDllApp theApp;
HMODULE module = (HMODULE)theApp.m_hInstance;
HRSRC myResource = ::FindResource(module,
            MAKEINTRESOURCE(IDR_FILE_RESOURCE), _T("GROUP_NAME"));

Если вы предоставите NULL в FindResource, приложение не найдет ваш ресурс.