Форум программистов, компьютерный форум CyberForum.ru

DLL - контейнер текстовых файлов, как редактировать текст? - C++

Восстановить пароль Регистрация
 
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
03.03.2014, 19:02     DLL - контейнер текстовых файлов, как редактировать текст? #1
Есть DLL, в которую вложены текстовые файлы в качестве ресурсов. Кроме ресурсов в DLL нет ничего, т.е. это DLL-контейнер.
Чтение текста из такой DLL я освоил. Но мне нужна и корректура (редактирование) текста, находящегося в такой DLL.
Можно ли редактировать текст, который вложен в DLL? Если да, то как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2014, 19:02     DLL - контейнер текстовых файлов, как редактировать текст?
Посмотрите здесь:

Ужатие текстовых файлов C++
С использованием текстовых файлов C++
C++ Контейнер для файлов
Обработка текстовых файлов C++
Как совместить функциональность EXE и DLL файлов в одном выполняемом. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
03.03.2014, 19:07     DLL - контейнер текстовых файлов, как редактировать текст? #2
Цитата Сообщение от kotgav Посмотреть сообщение
Чтение текста из такой DLL я освоил
можно пример с комментами?)) а то у меня всё руки не доходят до того чтобы разобраться с работой dll'ок
ну если не затруднит, типа хеллоу ворд! для длл
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
04.03.2014, 13:04  [ТС]     DLL - контейнер текстовых файлов, как редактировать текст? #3
Попробую описать здесь.
DLL-контейнер с текстовыми ресурсами может использоваться (читаться вложенный в нее текст) двумя способами:
- из приложения .exe;
- из другой библиотеки DLL, которая в свою очередь используется .exe приложением к Windows.
Соответственно есть и два способа создания и чтения библиотеки-контейнера текстовых файлов.
Для первого способа - библиотека читается из .exe приложения (описываю применительно к среде VS2010 Professional).
==============================================================
Создаем новый проект для Win32 динамически загружаемую библиотеку DLL с автоматическим созданием проекта и всех предкомпилируемых файлов.
После завершения автоматического создания проекта, можно откорректировать главную функцию библиотеки (находится в файле dllmain.cpp). Сразу после создания эта функция выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Т.к. главная функция в библиотеке-контейнере ничего не делает, то оставляем в ней только описание, вот такое:
C++
1
2
3
4
5
6
7
// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
 
BOOL APIENTRY DllMain( HMODULE, DWORD, LPVOID)
{
    return TRUE;
}
В этом случае главная функция библиотеки при обращении к ней будет просто воз-вращать значение True.
После этого в проект включаем нужные ресурсы, которые и будут храниться в этой DLL. Напомню, что во время компиляции файлы ресурсов включаются в библиотеку DLL и находятся внутри нее. Поэтому библиотеку можно копировать или переносить в любое другое место и на другой компьютер, содержимое ресурсов будет оставаться в библиотеке и будет доступно из любого места.
Для примера, включим в нашу библиотеку в качестве ресурса текстовый файл Air-portsDATA.txt. Создадим в проекте папку для хранения ресурсов Resource и поместим в нее данный текстовый файл.
Добавим текстовый ресурс добычным порядком добавления ресурсов (правой кнопкой щелкнем по папке Файлы ресурсов, выберем опцию Добавить ресурс, в открыв-шемся меню нажимаем кнопку Импорт, тип файлов – все файлы, выбираем нужный тек-стовый файл и в предложенном окне ввода отсутствующих типов вводим RCDATA). В результате будет сформирован файл ресурсов .rc и заголовочный файл resource.h. В заго-ловочном файле будет определен файл ресурса:

#define IDR_RCDATA1 101

Для того, чтобы использовать библиотеку в дальнейшем, создадим заголовочный файл с таким же именем, как и имя проекта, в нашем случае Sht_ResOnly_DLL.h. В этот файл помещаем определение ресурса:

#pragma only
#include "stdafx.h"

#define IDR_RCDATA1 101
Компилируем проект, в результате получим файл нашей библиотеки-контейнера DLL, внутри которой содержится текстовый файл ресурса. Поскольку в этой библиотеке нет экспортируемых переменных, то lib-файл не создается. Поэтому такая библиотека может загружаться только явно, т.е. для доступа к ней достаточно иметь файл самой библиотеки.
Для объяснения содержания библиотеки-контейнера и доступа к номерам ресурсов, хранящихся в ней, следует вместе с файлом .dll также поставлять другим пользователям заголовочный файл *DLL.h. Заголовочный файл для доступа к библиотеке включать в проект, осуществляющий доступ к ресурсам библиотеки, не надо, он нужен только для информации.

Использование библиотеки-контейнера текста достаточно простое. Надо поместить библиотеку с встроенным текстовым ресурсом в какое-то удобное место и указать в приложении, из которого будет читаться текст библиотеки, путь к DLL.
Чтение текстового ресурса уже обсуждалось на этом форуме, по моему нику можно найти эту тему.
Часть кода .exe приведу здесь. В этом примере читается текст ресурса с данными аэропорта.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
void Sht_LoadLibraryResDLL()
{
    std::setlocale(LC_ALL, "Russian_Russia.1251");  // Устанавливаем русский шрифт для окна консоли
    HMODULE  hDll;
    int NumName = 101;
    int NumType = 10;
 
    hDll = LoadLibrary(_T("..\\Resource\\Sht_ResOnly_DLL.dll")); // Загружаем библиотеку
    if (hDll == NULL)           // Проверяем результат загрузки библиотеки
    {
        std::cout << "Библиотека Sht_ResOnly_DLL.dll не загружена!\n" << std::endl;
        return;
    }
    else
    {
        std::cout << "Библиотека Sht_ResOnly_DLL.dll загружена!\n" << std::endl;
    }
 
    // Определяем указатели имени ресурса
    wchar_t const *pResName = MAKEINTRESOURCEW(NumName); // Номер в resource.h
    std::cout << "NumName:  " << NumName << std::endl;
    std::cout << "pResName:  " << pResName << std::endl;
    // Определяем указатель для типа ресурса
    wchar_t const *pResType = MAKEINTRESOURCEW(NumType); //RCDATA для текстового файла
    std::cout << "NumType:  " << NumType << std::endl;
    std::cout << "pResType:  " << pResType << std::endl;
    
    // Производим поиск ресурса
    HRSRC const hResInfo = FindResourceW(hDll, pResName, pResType);
    std::cout << "hResInfo:  " << hResInfo << std::endl;
    if (NULL == hResInfo)
    {
        std::cout << "Ресурс не найден!" << std::endl;
        return;  // Если ресурс не найден, возвращается 0 по умолчанию, выход из программы
    }
 
    // Определяем размер ресурса
    DWORD const ResSize = SizeofResource(hDll, hResInfo);
    if (0 == ResSize)
    {
        std::cout << "Размер ресурса не определен!" << std::endl;
        return;  // Если размер ресурса не определен, возвращается 0 по умолчанию, выход из программы
    }
 
    // Загружаем ресурс в память
    HGLOBAL const hRes = LoadResource(hDll, hResInfo);
    if (NULL == hRes)
    {
        std::cout << "Ресурс не загружен!" << std::endl;
        return;  // Если ресурс не загружен, возвращается 0 по умолчанию, выход из программы
    }   
    
    // Получаем указатель на ресурс, как на строку. Читаем его
    VOID const *pResData = LockResource(hRes);
    if (NULL == pResData)
    {
        std::cout << "Ресурс не читается!" << std::endl;
        return;  // Если ресурс не читается, возвращается 0 по умолчанию, выход из программы
    }   
 
    std::string     TextFromResource, str1;
    std::string     KodIKAOProm;
 
    TextFromResource.append(static_cast<char const *>(pResData), static_cast<DWORD>(ResSize));   // Читаем весь большой ресурс до последнего символа
 
    std::cout << "dwSize:  " << ResSize << "\n" << std::endl;        // Выводим размер файла
    // Рассчитываем количество строк по 76 символов
    int SumStr = 0, NumStr = 0;   // Количество строк, номер строки
    SumStr = ResSize/76;
    std::cout << "Количество строк: " << SumStr << "\n" << std::endl;
 
    do
    {
    // Выводим требуемое количество символов: первая цифра - начало, вторая - количество читаемых символов
    KodIKAOProm = str1.assign(TextFromResource, (NumStr*76)+24, 4);         // Код ИКАО из первой строки
    std::cout << "Код ИКАО:  " << KodIKAOProm << std::endl;
 
        //str1.assign(TextFromResource, 784, 4);         // Код ИКАО из 11-й строки (к 24 символам добавляем 76х10)
        //std::cout << "Код ИКАО:  " << str1 << "\n" << std::endl;
 
        //str1.assign(TextFromResource, 1696, 4);         // Код ИКАО из 23-й строки (к 24 символам добавляем 76х22)
        //std::cout << "Код ИКАО:  " << str1 << "\n" << std::endl;
        // Выводим широту аэропорта
        str1.assign(TextFromResource, (NumStr*76)+40, 9);         // Код ИКАО из 23-й строки (к 24 символам добавляем 76х22)
        std::cout << "Широта:  " << str1 << std::endl;
        // Выводим долготу аэропорта
        str1.assign(TextFromResource, (NumStr*76)+49, 11);         // Код ИКАО из 23-й строки (к 24 символам добавляем 76х22)
        std::cout << "Долгота: " << str1 << "\n" << std::endl;
        system("pause");  // Останавливаем вывод для контроля данных каждого аэропорта
        ++NumStr;
    } while(NumStr <= SumStr);
 
 
      FreeLibrary(hDll);                // Освобождаем библиотеку
}
 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// Главная функция программы
 
int _tmain(int argc, _TCHAR* argv[])
{
    Sht_LoadLibraryResDLL();    // Функция с ресурсом
    system("pause");
    
    return 0;
}
Компилируем наш проект, в результате в консольное окно начнут выводиться данные аэропортов из библиотеки-контейнера.

Второй случай - библиотека открывается из другой библиотеки, которая в свою очередь открывается из приложения .exe.
=============================================================================
В этом случае получается такая цепочка чтения ресурсов из библиотеки-контейнера:
exe-файл > библиотека DLL №1 > библиотека DLL-контейнер ресурса
В этом случае библиотека №2 (назовем ее библиотекой чтения ресурса) должна содержать функции и переменные для чтения ресурса из библиотеки-контейнера ресурса.
Пример не привожу, т.к. этот случай более специфичный и более редкий.

Добавлено через 16 часов 19 минут
Мой вопрос остается открытым - как можно редактировать текст в библиотеке-контейнере?
Хотя бы направление работы кто-нибудь даст?
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
06.03.2014, 10:43  [ТС]     DLL - контейнер текстовых файлов, как редактировать текст? #4
Мой вопрос по состоянию на 6 марта 2014 г. прочли 58 человек, пока советов нет.
Уточню проблему.
Есть библиотека DLL с текстовым файлом, который вложен в DLL как ресурс.
Требуется корректировать это текст-ресурс из приложения .exe.
В принципе можно это делать, или ресурсы в DLL не могут быть откорректированы ни из какого внешнего приложения или другой библиотеки?
Если можно, то как?
Yandex
Объявления
06.03.2014, 10:43     DLL - контейнер текстовых файлов, как редактировать текст?
Ответ Создать тему
Опции темы

Текущее время: 14:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru