Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
#1

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

23.06.2014, 21:22. Просмотров 412. Ответов 2
Метки нет (Все метки)

Задача такая: открыть 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);
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 21:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При чтении dll библиотеки в обычном(не бинарном) виде, чтение прерывается на NULL (C++):

Warning при компиляции при чтении из msado15.dll - C++
Warning:workvcmfcmymfcdebugmsado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned Кто...

Распечатать многочлен, заданный в виде односвязного списка, в обычном виде - C++
Люди помогите пожалуйста. Вообще не знаю как подступиться к задаче. Заранее спасибо! Многочлен от одной переменной Х можно представить...

CDialogEx + dll, После завершения модального диалога (CDialogEx) из длл-библиотеки работа длл-библиотеки прерывается - Visual C++
Добрый день, подскажите, пожалуйста, новичку с++/mfc. Работаю в VS 2010. Есть необходимость разработки длл-библиотеки, которая в своём...

Чтение файла в бинарном виде ЧАСТЯМИ - VBA
Собственно вопрос в самом названии темы. Возможно ли читать файл функцией Open sFile For Binary As #1 по частям? Как мы выцепляем...

Ошибка при бинарном чтении файла - C++ Builder
Всех приветствую! Написал код для чтения строки из файла, но выдаёт ошибку, понятия не имею почему. Проект нормально компилируется. Но при...

Проблема при бинарном чтении BMP файла - Visual Basic
Проблема возникла при бинарном чтении BMP файла а точнее структуры BITMAPFILEHEADER и BITMAPINFOHEADER в начале файла. При считывании...

2
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.06.2014, 02:21 #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];
1
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
24.06.2014, 15:35  [ТС] #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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2014, 15:35
Привет! Вот еще темы с ответами:

Разные результаты работы при обычном запуске и при дебаге (использование dll) - Perl
Есть dll, в ней есть процедура и функция, которые мне надо использовать procedure SetStr(aStr : PChar) stdcall; external 'DLLTest.dll'; и ...

Слетели библиотеки .dll При запуске любых приложений на компьютере вылетает ошибка с расширением .dll - Windows 8, 8.1
Не запускается приложения на windows 8. А также удалились точки доступа Восстановления Системы и компьютер глючит в последнее время. Что...

разработать драйвер доступа к портам ввода-вывода в виде библиотеки DLL - Delphi
надо 2 задачки на зачет не знаю точно в какую группу себя отнести очень надеюсь на вашу помощь 1. разработать драйвер доступа к...

Ошибка при подключении библиотеки Dll - C++
Пши программу, которая через Dll общается с другой программой. О Dll известно только одно: названия нескольких функций внутри. Более...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru