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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
#1

VC++2010 не могу открыть ресурсы - C++

07.12.2013, 17:59. Просмотров 1385. Ответов 28
Метки нет (Все метки)

Снова обращаюсь к уважаемому обществу. На этот раз проблема такая (VS2010 Professional, консольное приложение).
Включил текстовый файл .txt в ресурсы. Написал такой доступ к нему (ниже). Однако никак такой код не хочет находить мой ресурс, сразу уходит на сообщение "Ресурс не найден". Т.е. функция FindResource возвращает не имя ресурса, а NULL.
Что надо сделать, чтобы ресурс был найден и можно было читать данные из текстового файла?
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
#include <windows.h>
#include <tchar.h>
#include <conio.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstring>
#include <clocale>
#include <strsafe.h>
 
// == Пробная Функция открытия текстового файла ресурса и чтения строк и символов из него ======
 
char ShtReadDATAFromFile()
{
    std::setlocale(LC_ALL, "Russian_Russia.1251");   // Устанавливаем русский шрифт для окна консоли
 
    HRSRC hShtDataTXT = NULL;      // Определяем и инициализируем переменную ресурса
    char buf[75] = {0};                  // Определяем и инициализируем нулями сроку длиной 75 символов    
    
    HMODULE hModule = NULL;
    LPCTSTR IpName = "IDR_TEXT1";
    LPCTSTR IpType = "TEXT";
    hShtDataTXT = FindResource(hModule, IpName, IpType);  // Ищем файл ресурса. Получаем указатель на ресурс
 
    if(hShtDataTXT!=NULL)         // Если указатель не равен нулю 
    {
        std::cout <<  "Ресурс найден!" << "\n" << std::endl;
        HGLOBAL  hShtAirportsRes = NULL;   // Определяем и инициализируем переменную для работы с другими функциями
        hShtAirportsRes = LoadResource(0, hShtDataTXT);  // Загружаем и открываем файл ресурса 
        if(hShtAirportsRes!=NULL)
        {
            LPVOID res = LockResource(hShtAirportsRes);         // Фиксируем наш файл в памяти, для чего передаем указатель HGLOBAL.
                                                                // Приводим к типу const char* и работаем с указателем как со строкой, хранящей все содержимое файла
            DWORD dwSize = SizeofResource(0, hShtDataTXT);      // Определяем размер нашего текстового файла
            char *t = (char* )res;
            
            std::ifstream  AirportDATA("ShtProba.txt");    // Объявляем объект AirportDATA типа ifstream и открываем текстовый файл ресурса для вывода данных
            std::cout <<  "Файл открыт!" << "\n" << std::endl;
 
            AirportDATA.getline(buf, 75, 0);                  // Считываем первую строчку
            std::cout <<  "A:  " << AirportDATA.getline(buf, 75, 0)  << std::endl;
            return buf[1];
        }
        else
        std::cout <<  "Файл не открыт!" << "\n" << std::endl;
           return NULL;                // Если файл не открыт, возвращается 0 по умолчанию
    }
    else
        std::cout <<  "Ресурс не найден!" << "\n" << std::endl;
        return NULL;            // Если ресурс не найден, возвращается 0 по умолчанию
}
 
// Главная программа С++
//--------------------------------
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
    ShtReadDATAFromFile();
 
    std::system("Pause");               // Предотвращение закрытия консольного окна
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2013, 17:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос VC++2010 не могу открыть ресурсы (C++):

vs 2010 выдает ошибку fatal error C1083: Не удается открыть файл включение: iostream.h: No such file or directory - C++
всем привет! помогите пожалуйста исправить ошибку! вот код! #include &quot;StdAfx.h&quot; #include &lt;iostream.h&gt; using namespace std; ...

vs 2010 выдает ошибку fatal error C1083: Не удается открыть файл включение: ntddcdrm: No such file or directory - C++
Не понимаю в чем ошибка,помогите,пожалуйста. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;winioctl.h&gt; ...

Не могу создать проект в VS 2010 - C++
Здравствуйте форумчане! В общем скачал на днях visual studio 2010 proffesional, в итоге при ее запуске я не могу создать проект, как это...

Не могу открыть хост - C++
Хочу написать программку которая будет редактировать файл host... но при написание кода (стандартное открытие файла) комп не может открыть,...

Не могу открыть проект С++ - C++
Есть готовые исходники задачи, все лежит в папке, могу открыть каждый файл по отдельности и просмотреть код через visual studio 2013...

Не могу нормально открыть файл - C++
Скачал Microsoft Visual C ++ 2010, создал пустой проект, добавил файл с вот таким кодом. #include &lt;stdio.h&gt; int main() { ...

28
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 21:43 #16
Цитата Сообщение от kotgav Посмотреть сообщение
Указатель типа char на ячейку используем для вывода содержимого файла.
При таком выводе, в конце данных для вывода, должен быть терминальный ноль. Если его нет (
Цитата Сообщение от Убежденный Посмотреть сообщение
По умолчанию ресурсы не обязаны заканчиваться нулевым символом.
), то вывод будет продолжаться дальше, до тех пор, пока в памяти не встретится 0.
1
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
10.12.2013, 21:55  [ТС] #17
Терминальный ноль - это вот этот символ '\0'?
Я его поставил в конце файла, он выводится вместе содержанием файла и сообщением после текста. Т.е. ничего не меняется.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.12.2013, 23:02 #18
Цитата Сообщение от kotgav Посмотреть сообщение
Я его поставил в конце файла
Вот это интересно... Каким образом?
Цитата Сообщение от kotgav Посмотреть сообщение
Я его поставил в конце файла, он выводится вместе содержанием файла
Выводится терминальный ноль? И как вы это видите? Терминальный ноль не имеет графического отображения, или это не терминальный ноль.
1
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
11.12.2013, 10:14  [ТС] #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот это интересно... Каким образом?
Открыл свой текстовый ресурс в проекте, в конце дописал \0. И сохранил это изменение.
Почерпнул этот прием из учебника: Прохоренок Н.А. Глава 6 Символы и строки стр.20. (на первом скрине выдержка из учебника).
Указывал и без кавычек, и в кавычках символ \0 выводится как обычный символ.

Цитата Сообщение от alsav22 Посмотреть сообщение
Выводится терминальный ноль? И как вы это видите? Терминальный ноль не имеет графического отображения, или это не терминальный ноль.
На втором скрине после последней строчки (со словом ALERT).

Если это не терминальный ноль (а это так, иначе файл бы читался корректно), и строка
char *TXTFile = (char* )res;
неправильная, то как правильно написать? Подскажите, пожалуйста!
0
Миниатюры
VC++2010 не могу открыть ресурсы   VC++2010 не могу открыть ресурсы  
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
11.12.2013, 10:51 #20
Можно так, как в моем примере:
C++
1
2
std::string TextFromResource;
TextFromResource.append(/* здесь указатель на ресурс и его длина */)
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 17:16 #21
Цитата Сообщение от kotgav Посмотреть сообщение
Открыл свой текстовый ресурс в проекте, в конце дописал \0. И сохранил это изменение.
Почерпнул этот прием из учебника: Прохоренок Н.А. Глава 6 Символы и строки стр.20. (на первом скрине выдержка из учебника).
Указывал и без кавычек, и в кавычках символ \0 выводится как обычный символ.
На скрине, разве '\0' добавляется в текстовом редакторе (как вы сделали)? Когда вы в текстовом редакторе пишите '\0', то это не терминальный ноль (управляющий символ), а просто четыре символа. Терминальный ноль существует в языке, в коде, (в редакторе его нет), и использовать его можно только методами языка. Например, строковые функции чтения из файла добавляют его в конец строки. В файл, терминальный ноль, можно записать в бинарном режиме, т.е., открыть файл для дозаписи в конец файла (ios::app), и, в бинарном режиме, записать туда переменную char, со значением 0:
C++
1
2
3
4
5
fstream f("file.txt", ios::app);
char ch = 0;
f.write((const char*)&ch, 1);
 
f.close();
1
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
11.12.2013, 17:26  [ТС] #22
Вот какой код в результате получился:
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
void ShtReadDATAFromFileRes()
{
    std::setlocale(LC_ALL, "Russian_Russia.1251");        // Устанавливаем русский шрифт для окна консоли
 
    /*Получаем хэндл модуля (исполняемого файла, *.exe или *.dll), в котором лежит ресурс.
    NULL означает модуль, ассоциированный с текущим процессом, хотя возвращен будет не ноль, а хэндл модуля.
    При работе с текущим модулем можно сразу вызывать FindResource, передавая первым параметром NULL, а под VCL можно использовать глобальную HInstance*/
    HMODULE hModS = GetModuleHandle(NULL);
    std::cout << "hModS:   " << hModS << std::endl;    // Вызываем в консоль для проверки
 
    HRSRC hShtDataTXT = NULL;            // Определяем и инициализируем переменную ресурса
 
    // Определяем указатели имени и типа ресурса
    wchar_t const *pResName = MAKEINTRESOURCEW(115); // Номер в resource.h
    wchar_t const *pResType = MAKEINTRESOURCEW(10);  // RT_RCDATA для текстового файла
    
    // Производим поиск ресурса
    HRSRC const hResInfo = FindResourceW(hModS, pResName, pResType);
    if (NULL == hResInfo)
    {
        std::cout << "Ресурс не найден!" << std::endl;
        return;  // Если ресурс не найден, возвращается 0 по умолчанию, выход из программы
    }
    
    // Определяем размер ресурса
    DWORD const ResSize = SizeofResource(NULL, hResInfo);
    if (0 == ResSize)
    {
        std::cout << "Размер ресурса не определен!" << std::endl;
        return;  // Если размер ресурса не определен, возвращается 0 по умолчанию, выход из программы
    }
 
    // Загружаем ресурс в память
    HGLOBAL const hRes = LoadResource(NULL, 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 Str;
            std::string TextFromResource;
            TextFromResource.append(static_cast<char const *>(pResData), static_cast<DWORD>(ResSize));
 
            std::cout << "dwSize:  " << ResSize << "\n" << std::endl;
            std::cout << "TXTFile:  " << "\n" << TextFromResource << std::endl;
}
Результат показан на скрине консольного окна, файл читается правильно.
0
Миниатюры
VC++2010 не могу открыть ресурсы  
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
11.12.2013, 17:30  [ТС] #23
Цитата Сообщение от alsav22 Посмотреть сообщение
На скрине, разве '\0' добавляется в текстовом редакторе (как вы сделали)? Когда вы в текстовом редакторе пишите '\0', то это не терминальный ноль (управляющий символ), а просто четыре символа. Терминальный ноль существует в языке, в коде, (в редакторе его нет), и использовать его можно только методами языка. Например, строковые функции чтения из файла добавляют его в конец строки. В файл, терминальный ноль, можно записать в бинарном режиме, т.е., открыть файл для дозаписи в конец файла (ios::app), и, в бинарном режиме, записать туда переменную char, со значением 0:
C++
1
2
3
4
5
fstream f("file.txt", ios::app);
char ch = 0;
f.write((const char*)&ch, 1);
 
f.close();
А, так файл надо было просто открыть, не как ресурс? И тогда его откорректировать функциями работы с открытым файлом? А потом закрыть и снова открыть и читать как файл ресурса?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 17:44 #24
Цитата Сообщение от kotgav Посмотреть сообщение
А, так файл надо было просто открыть, не как ресурс? И тогда его откорректировать функциями работы с открытым файлом? А потом закрыть и снова открыть и читать как файл ресурса?
Да.
1
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
11.12.2013, 17:50  [ТС] #25
Понятно.
Убежденный и alsav22!
Большое Вам спасибо за помощь!
Вопрос с открытием и чтением ресурса решен.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.12.2013, 17:51 #26
Цитата Сообщение от kotgav Посмотреть сообщение
А, так файл надо было просто открыть, не как ресурс? И тогда его откорректировать функциями работы с открытым файлом? А потом закрыть и снова открыть и читать как файл ресурса?
Но это, если очень нужно именно через терминальный ноль в конце файла (некое извращение). Если есть другой способ, то лучше его использовать.
0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
22.12.2013, 12:22  [ТС] #27
Возвращаюсь к проблеме чтения ресурса.
Мне надо, чтобы ресурс хранился в библиотеке. Там же происходит некоторая обработка, связанная с чтением ресурса. На основе примера в сообщении #22 я сделал функцию чтения текстового ресурса, подключил к библиотеке ресурс и скомилировал файл *.dll.
Из исполняющей exe программы я обращаюсь к библиотеке и хочу увидеть значение одного из параметров ресурса.
Библиотека и библиотечная функция чтения ресурса отыскиваются нормально, параметр HMODULE hModS имеет не нулевое значение, параметры функции
HRSRC const hResInfo = FindResourceW(hModS, pResName, pResType);
тоже имеют ненулевые значения, т.е. функция нахождения текстового ресурса FindResourceW должна завершиться с ненулевым значением. А она возвращает 0!
Т.е. ресурс на находит.
В то же время, если я подключаю ресурс также и в исполняющую программу, то ресурс библиотечная функция находит и открывает исправно.
В чем может быть дело?
Мне надо хранить ресурс именно в библиотеке.

Добавлено через 11 минут
Дополнение.
Если точнее описать задачу, то мне надо иметь две библиотеки.
Одна - с текстовыми файлами ресурсов.
Другая - с функциями обработки тестовых файлов ресурсов, из которой вызывается первая библиотека.
А уже исполняющая программа вызывает вторую библиотеку.
Т.е. такая пирамида получается:
исполняющая программа -> библиотека2 -> библиотека1(с ресурсами).
0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
24.12.2013, 14:58  [ТС] #28
Еще дополнение.
Попробовал открывать текстовый файл (не ресурс) через библиотеку с помощью std::ifstream, open() и прочих функций открытия текстового файла.
Не Открывает!
Может быть С++ в принципе не может работать с файлами-ресурсами и текстами через библиотеку?
Если так, то грустно!
0
kotgav
2 / 2 / 0
Регистрация: 13.07.2013
Сообщений: 62
19.01.2014, 15:24  [ТС] #29
Для тех, кто столкнется с такой же проблемой.
Напомню, что мне надо было использовать ресурс, находящийся в текстовом файле и включенный в библиотеку DLL №1. В свою очередь, доступ к библиотеке DLL №1 должен быть из библиотеки DLL №2. А уже доступ к библиотеке DLL №2 должен быть из исполняющего файла. Т.е. цепочка доступа к ресурсу такая:
исполняющая программа -> библиотека №2 -> библиотека №1(с ресурсами).
Открытие файла ресурса, который находится в библиотеке №1, через библиотеку № 1, долго не мог произвести и вот наконец добился положительного результата.
Причина оказалась простой - соглашение о вызовах!
Это соглашение о вызове функции для доступа к библиотеке и ресурсам (у меня оно extern "C" __declspec(dllexport) ) было записано только в библиотеке №1. А во второй библиотеке написать забыл. Поэтому доступ к библиотекам был, а доступа к функциям, и соответственно - к ресурсам, не было.
Теперь все работает, ресурс через две библиотеки открывается и читается.
0
19.01.2014, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2014, 15:24
Привет! Вот еще темы с ответами:

Не могу открыть файл fstream - C++
Добрый день. Не могу открыть файл с помощью fstream файл, файл лежит в корне проекта. Пользуюсь QT creator с gcc. #include &lt;iostream&gt; ...

Не могу открыть файл OFSTREAM - C++
Доброго времен суток! Помогите разобраться: пытаюсь открыть файл с параметром ios::out, а он не открывается :( Почему это может...

Не могу открыть старые проекты - C++
Вобщем все началось с переустановки ОС, на С ++ я работаю недели 2-3. Мои проекты сохранялись в документах на диске С, перед переустановкой...

Не могу открыть программу на других компьютерах - C++
Здравствуйте! Написал програмку которая общается с SQLite и делает разные запросы к ней. У меня всё работает прекрасно! Но на других...


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

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

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