Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36

Работа с ресурсами в dll

16.01.2020, 12:48. Показов 1725. Ответов 16

Студворк — интернет-сервис помощи студентам
Имеется проект который компилируется в dll. В ресурсах есть собственный файл. Нужно передать из него данные в этой же dll
Пробую подключиться к нему так, но по какой-то причине FindResource не находит ресурс и собственно выходит не бряке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
std::ofstream out1;          
            out1.open("C:\\Logs\\1.txt");
            HMODULE hMod = GetModuleHandle(NULL);
            if (!hMod) {
                out1 << "err1: "<< hMod << std::endl;
                break;
            }
            else { out1 << "OK1: " << hMod << std::endl; }
 
            HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(101), MAKEINTRESOURCE("IDR_TST"));
 
            if (!hRes) {
                out1 <<"err2: "<< hRes << std::endl;
                break;
            }
            HGLOBAL hGlob = LoadResource(hMod, hRes);
 
            if (!hGlob) {
                out1 << "err3: "<< hGlob << std::endl;
                break;
            }
            
            BYTE* lpbArray = (BYTE*)LockResource(hGlob);
            if (!lpbArray) {
                out1 << "err3: " << lpbArray <<std::endl;
                break;
            }
Кто подскажет, в чем может быть проблема или хотя бы скинет нормальный пример как это делается?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2020, 12:48
Ответы с готовыми решениями:

Как создать и использовать DLL с ресурсами?
Собственно, как создавать DLL и использовать ее функции - я знаю. А вот как создать библиотеку, которая будет хранить только ресурсы и как...

Работа с ресурсами
В ресурсах программы есть текстовик (.txt). Эта же программа должна достать его, изменить и упаковать обратно к себе в ресурсы. Help :read:

Работа с ресурсами c++
Всем опять привет, я нашёл этот код на этом форуме: HRSRC myResource = FindResource(NULL, &quot;IDR_BIN1&quot;, RT_RCDATA); unsigned int...

16
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 13:51
Цитата Сообщение от AltTwo Посмотреть сообщение
Кто подскажет, в чем может быть проблема или хотя бы скинет нормальный пример как это делается?
Скорее всего, GetModuleHandle возвращает хэндл екзешника, попробуй передать ему имя своей dll
0
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 14:06  [ТС]
При попытке сделать так:
C++
1
HMODULE hMod = GetModuleHandle(MAKEINTRESOURCE("GetImageFragment.dll"));
Все вылетает и не отрабатывает вовсе
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 14:08
Цитата Сообщение от AltTwo Посмотреть сообщение
Все вылетает и не отрабатывает вовсе
C++
1
HMODULE hMod = GetModuleHandle("GetImageFragment.dll");
0
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 14:25  [ТС]
"Ошибка (активно) E0167 аргумент типа "const char *" несовместим с параметром типа "LPCWSTR""
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 14:27
Цитата Сообщение от AltTwo Посмотреть сообщение
"Ошибка (активно) E0167 аргумент типа "const char *" несовместим с параметром типа "LPCWSTR""
GetModuleHandle(L"GetImageFragment.dll")
0
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 14:35  [ТС]
Возвращает 0 и выходит после условия по бряку.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 14:41
Цитата Сообщение от AltTwo Посмотреть сообщение
Возвращает 0 и выходит после условия по бряку.
А ты это дллку вообще загружаешь? Попробуй вместо GetModuleHandle сделать
C++
1
HMODULE hMod = ::LoadLibraryEx(L"GetImageFragment.dll", NULL, LOAD_LIBRARY_AS_IMAGE_RESOURCE);
Только укажи полный путь к GetImageFragment.dll
0
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 15:06  [ТС]
Я это прописываю в самой dll. Определить же полный путь будет проблематично, так как она архивируется в zip, подцепляется через nativeapi и вызывается дальше через черт-знает-что в 1с.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 15:18
Что значит в самой dll?
Цитата Сообщение от AltTwo Посмотреть сообщение
HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(101), MAKEINTRESOURCE("IDR_TST"));
Здесь вторым параметром должен указываться тип ресурса - https://docs.microsoft.com/en-... urce-types

Добавлено через 40 секунд
У тебя есть исходники этой dll? Покажи rc-файл
0
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 15:35  [ТС]
Полагаю интересует этот фрагмент:

C++
1
2
3
4
5
6
/////////////////////////////////////////////////////////////////////////////
//
// TST
//
 
IDR_TST                 TST                     "C:\\Users\\Work\\Documents\\Work\\Test.epf"
И да GetModuleHandle(NULL) действительно ловил .exe файл. Все же основная проблема именно в нем, так как получить дескриптор самого dll не выходит.
0
Заблокирован
16.01.2020, 15:55
Цитата Сообщение от AltTwo Посмотреть сообщение
так как получить дескриптор самого dll не выходит
Надо выгрузить на диск (записать), из памяти не будет работать.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 16:25
Цитата Сообщение от AltTwo Посмотреть сообщение
Все же основная проблема именно в нем, так как получить дескриптор самого dll не выходит.
Не факт.
Для начала сделай
C++
1
HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(101), L"IDR_TST");
Не надо оборачивать строки в MAKEINTRESOURCE

Добавлено через 1 минуту
Второе - файлы обычно кладутся в RT_RCDATA, т.е. при импорте в студии указываешь тип ресурса RCDATA, потом делаешь FindResource(...., RT_RCDATA)
1
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 17:11  [ТС]
У меня вышло получить дескриптор через DLLMain.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HINSTANCE hDll;
 
BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hDll = (HINSTANCE)hModule;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
По нему я выяснил что сама dll выгружается в AppData\Local\Temp\v8_4DDD_12.tmp
Ресурс по нему получается, размер его определяется верно.

Кстати, у меня почему-то нет RCDATA в списке при импорте, хотя в winuser он как обычно значится.

Спасибо за помощь. Буду дальше копать в сторону прочитать/записать этот файл и передать данные наружу.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 17:47
Цитата Сообщение от AltTwo Посмотреть сообщение
Кстати, у меня почему-то нет RCDATA в списке при импорте, хотя в winuser он как обычно значится.
Там не в списке, его надо руками вписывать при импорте
0
5 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 36
16.01.2020, 17:52  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
надо руками вписывать при импорте
У меня при введении руками RCDATA при импорте он не относит ресурс к RT_RCDATA, а создает некий новый RT_RCDATA1
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
16.01.2020, 17:57
Цитата Сообщение от AltTwo Посмотреть сообщение
У меня при введении руками RCDATA при импорте он не относит ресурс к RT_RCDATA, а создает некий новый RT_RCDATA1
C++
1
2
3
4
5
6
/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//
 
IDR_RCDATA3             RCDATA                  "D:\\Temp\\1.docx"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2020, 17:57
Помогаю со студенческими работами здесь

Работа с ресурсами
Всем доброго времени суток, с наступившим новым годом! Есть проблема: Я создал две процедуры, первая считывает из файла в ресурсах,...

Работа с ресурсами.
Какая функция отвечает за удаление ресурса из exe проги во время её работы или по завершению работы? Ресурс достаю так: ...

Работа с ресурсами C#
Привет коллеги! Есть программа с ресурсом - X, эта программа создает сборку используя значения из textbox и выводит значения в messagbox. ...

Работа с ресурсами
как загрузить в ресурсы программы dll'ку, а при запуске выгрузить ее ? Добавлено через 19 минут ага нашел {$R 1.res} ...

Работа с ресурсами
Здравствуйте. Необходимо организовать проигрывание аудиофайла из папки Resources, но не с названием а с определенной подстановкой: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru