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

При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL - C++

Восстановить пароль Регистрация
 
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 21:22     При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL #1
Задача такая: открыть dll файл(не мой) в обычном текстовом виде(каким его могут открыть обычные блокноты), найти нужную последовательность символов и заменить их.
Проблема: при открытие dll читается до первого NULLа и прерывается.
Вот собственно код:
C++
1
2
3
4
5
6
7
// Открываем объект ядра "файл"
HANDLE hFile = CreateFile("client2.dll", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Создаем объект ядра "проекция файла"
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
// Проецируем в адресное пространство процесса объект "проекция файла"
string pbFile = (const char*) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 21:22     При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL
Посмотрите здесь:

C++ Открытия exeшника в бинарном виде
C++ Чтение из файла прерывается раньше времени
Преобразовать матрицу заданную в обычном виде в треугольную!(методом гаусса) Найти количество строк, среднее арифметическое элементов которых меньше з C++
запись vector в бинарном виде C++
Warning при компиляции при чтении из msado15.dll C++
Написать функцию, которая получает значение типа float и возвращает две строки: одна представляет вещественное число в обычном виде ,а другая C++
C++ Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
C++ Цикл не прерывается при вводе Enter

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2014, 02:21     При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mihalech19 Посмотреть сообщение
читается до первого NULLа и прерывается.
Где читается? Как читается? dll - это не текстовый файл, и это нужно учитывать.

Добавлено через 19 минут
Вот такое может не работать не с текстом:
Цитата Сообщение от mihalech19 Посмотреть сообщение
string pbFile = (const char*) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Если нужна такая string (не понятно, только, зачем?), то сначала нужно узнать размер файла (DWORD fileSize = GetFileSize(hFile, NULL)), а потом заполнить string байтами из файла:
C++
1
2
3
4
    char* pbFile = (char*)MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    string str;
    for (int i = 0; i < fileSize; ++i)
        str += pbFile[i];
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
24.06.2014, 15:35  [ТС]     При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL #3
Да , я понимаю , что это может показать полным абсурдом , но так нужно.
Как читается?
В память
Короче говоря, нужно просто считать файл в память. Но, когда я пытаюсь вывести на экран, выводится только пару символов и все (

Добавлено через 11 минут
Вот так получилось сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int _tmain(int argc, _TCHAR* argv[])
{
// Открываем объект ядра "файл"
HANDLE hFile = CreateFile("client2.dll", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Создаем объект ядра "проекция файла"
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
// Проецируем в адресное пространство процесса объект "проекция файла"
char* pbFile =  (char*) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
DWORD fileSize = GetFileSize(hFile, NULL);
string sFile;
for (int i = 0; i < fileSize; i++)
sFile +=pbFile[i] ;
//find_and_replace(sFile, "1134", "9999") ;
system("pause");
    return 0;
}
Но если пытаюсь вывести файл в консоль
C++
1
cout << sFile << endl;
, то очень медленно считывается и еще крашится , даже если сворачиваешь консоль

Добавлено через 3 часа 58 минут
Все нашел решение:
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
using namespace std;
void find_and_replace(string& source, string const& find, string const& replace)
{
    for(string::size_type i = 0; (i = source.find(find, i)) != string::npos;)
    {
        source.replace(i, find.length(), replace);
        i += replace.length() - find.length() + 1;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
 
// Открываем объект ядра "файл"
HANDLE hFile = CreateFile("client2.dll", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Создаем объект ядра "проекция файла"
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
// Проецируем в адресное пространство процесса объект "проекция файла"
char* pbFile =  (char*) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// Проецируем в адресное пространство процесса объект "проекция файла"
DWORD fileSize = GetFileSize(hFile, NULL);
string sFile;
for (int i = 0; i < fileSize; i++)
sFile +=pbFile[i];
find_and_replace(sFile, "1134", "9999") ;
 for (int i = 0; i < fileSize; i++)
  pbFile[i] = sFile[i];
 
system("pause");
 
    return 0;
}
Yandex
Объявления
24.06.2014, 15:35     При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL
Ответ Создать тему
Опции темы

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