Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный и нерабочий TResourceStream, C++Builder 2010 
V
    Опции темы
InfMag
Дата 1.1.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



В общем у меня возникла проблема с TResourceStream, причём возникала она не у меня одного, листал по поиску, проблемы свои люди всячески решали, но ни одно из решений не решило мою. В общем у меня есть JPEG в ресурсах. Сразу утверждаю, что с ресурсом всё в порядке, ибо следующий код прекрасно выводит мне размер ресурса:
Код

HRSRC TXS2rh = FindResource( appInstance, "MYJP", RT_RCDATA );
HGLOBAL TXS2rld = LoadResource( appInstance, TXS2rh );
LPVOID TXS2lrlk = LockResource( TXS2rld );
MessageBox( NULL, String( SizeofResource( NULL, TXS2rh ) ).t_str(), "", MB_OK );


А вот с TResourceStream я как только не игрался, вот различные варианты:
Код

TResourceStream *TXS2res = new TResourceStream( (unsigned)appInstance, "MYJP", L"RT_RCDATA" );
TResourceStream *TXS2res = new TResourceStream( (unsigned)appInstance, UnicodeString("MYJP"), (System::WideChar*)"RT_RCDATA" );
TResourceStream *TXS2res = new TResourceStream( 0, "MYJP", (System::WideChar*)"RT_RCData" );
TResourceStream *TXS2res = new TResourceStream( 0, PChar("MYJP"), (System::WideChar*)"RT_RCData" );
TResourceStream *TXS2res = new TResourceStream( 0, String("MYJP").t_str(), String("RT_RCData").t_str() );

В общем вариантов много разных было, но все, заразы выдают одно и тоже: RESOURCE MYJP NOT FOUND.

В чём логика?

Вот строка из RC файлика проекта:
Код

MYJP RCData "Debug\\myjp2.jpg"


Добавлено через 3 минуты и 7 секунд
Прошу прощения конечно, но хотелось бы для собственного понимания маленький попутный вопрос: L"RT_RCDATA" - L тут - это превращалка в wchar? Я просто в примере решения нашёл, но хочу понимать в чём суть.
PM   Вверх
Dem_max
Дата 1.1.2011, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



а так не пробовал ?
Код

TResourceStream *TXS2res = new TResourceStream(appInstance, L"MYJP", L"RT_RCDATA" );

или 
Код

#define IDI_JPEG   2000
TResourceStream *TXS2res = new TResourceStream(appInstance, MAKEINTRESOURCE(IDI_JPEG), L"RT_RCDATA" );



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
InfMag
Дата 1.1.2011, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Dem_max, первый способ не помог. А MAKEINTRESOURCE не подходит по той причине, что я хочу написать функцию, чтобы имя ресурса динамически подставлять.
Вопрос: на что ссылается отдефайненый 2000? Оффтоп: что делает приставка L? smile
Я всё-таки сделал для себя открытие! MAKEINTRESOURCE(MYJP) - ругается на [BCC32 Error] opengl.cpp(474): E2451 Undefined symbol 'MYJP' - странно, но чуть раньше я ссылался таким образом, и всё работало, а сейчас что-то слетело и ни один ресурс теперь не находится. define-ов писать не надо было, они уже автоматом в проекте видимо где-то дефайнятся. Может тут где-то собака зарыта? Что ссылки слетели на ресурсы? Я использую C++Builder 2010.

Добавлено через 3 минуты и 36 секунд
Таки получилось найти в справке об L - это действительно как я предполагал, WideChar, похоже идентично (System::WideChar*) или String(...).t_ctr()

Добавлено через 11 минут и 21 секунду
Добавлю, что следующий код всё-также прекрасно находит ресурс:
Код

HRSRC TXS2rh = FindResource( appInstance, "MYJP", RT_RCDATA );
HGLOBAL TXS2rld = LoadResource( appInstance, TXS2rh );
LPVOID TXS2lrlk = LockResource( TXS2rld );
MessageBox( NULL, String( SizeofResource( NULL, TXS2rh ) ).t_str(), "", MB_OK );

Может как-то с него можно Stream тип получить? И ну его нафиг этот привередливый TResourceStream?
PM   Вверх
InfMag
Дата 1.1.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Я даже вот так попробовал:
Код

TJPEGImage *TXS2J = new TJPEGImage;
HRSRC TXS2rh = FindResource( appInstance, "MYJP", RT_RCDATA );
HGLOBAL TXS2rld = LoadResource( appInstance, TXS2rh );
LPVOID TXS2lrlk = LockResource( TXS2rld );
TMemoryStream *TXS2ms = new TMemoryStream;
TXS2ms->SetSize( (int)SizeofResource( NULL, TXS2rh ) );
TXS2ms->Write( TXS2lrlk, (int)SizeofResource( NULL, TXS2rh ) );
TXS2J->LoadFromStream( TXS2ms );
TXS2J->SaveToFile("1.jpg");

Файл 1.jpg пуст, что я делаю не так? :'(

Добавлено через 5 минут и 9 секунд
Ура! Я это сделал!
Код

TJPEGImage *TXS2J = new TJPEGImage;
HRSRC TXS2resh = FindResource( appInstance, "MYJP", RT_RCDATA );
HGLOBAL TXS2memh = LoadResource( appInstance, TXS2resh ); // SizeofResource( NULL, TXS2rh );
LPVOID TXS2resprt = LockResource( TXS2memh );
TMemoryStream *TXS2ms = new TMemoryStream;
TXS2ms->SetSize( (int)SizeofResource( NULL, TXS2resh ) );
TXS2ms->Write( TXS2resprt, (int)SizeofResource( NULL, TXS2resh ) );
FreeResource( TXS2memh ); // (ДОБАВИЛ)
TXS2ms->Seek( 0, 0 ); // (ДОБАВИЛ)
TXS2J->LoadFromStream( TXS2ms );
TXS2J->SaveToFile("1.jpg");


Но вопрос остаётся открытым, я хочу окончательно разобраться в TResourceStream . Может это какой-то особенный глюк в 10-ой RAD студии?
PM   Вверх
Dem_max
Дата 2.1.2011, 11:33 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



кароче нужно делать так

в свойствах проекта в  С++ Compiler в Directories and Conditionals указать  UNICODE
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TResourceStream *TXS2res = new TResourceStream((unsigned int)HInstance, L"MYJP", RT_RCDATA);
    TXS2res->SaveToFile(L"1.jpg");
    delete TXS2res;
}


если же проект не юникодный то просто пишем так
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TResourceStream *TXS2res = new TResourceStream((unsigned int)HInstance, "MYJP", RT_RCDATA);
    TXS2res->SaveToFile("1.jpg");
    delete TXS2res;
}



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
InfMag
Дата 2.1.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Dem_max, по идее в RAD2010 все проекты теперь юникодом идут.
Код

TResourceStream *TXR = new TResourceStream( (unsigned int)appInstance, L"GTX2", RT_RCDATA );
TXR->SaveToFile( L"hahaha.jpg" );
delete TXR;

Код
[BCC32 Error] opengl.cpp(499): E2285 Could not find a match for 'TResourceStream::TResourceStream(unsigned int,const wchar_t *,char *)'

Второй пример ту же ошибку выдаёт. Я хочу обратить внимание на структуру, которая в ошибке описана: unsigned int,const wchar_t *,char *
RT_RCDATA - эта константа (или как это назвать не по дилетантски?) - она туда упорно не влезает, именно по тому я и писал L"RT_RCData".
Код

TResourceStream *TXR = new TResourceStream( (unsigned int)appInstance, "GTX2", L"RT_RCData" );
TXR->SaveToFile( "hahaha.jpg" );
delete TXR;

А вот этот код всё также выдаёт, что resource not found.
Тут я вообще себе целый класс составил на базе Find-Load-Lock-Resource + TMemoryStream:
http://unclechu.blog.com/2011/01/02/%D0%9A...tresource-v0-1/
PM   Вверх
Alexeis
Дата 2.1.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Код

TResourceStream *TXR = new TResourceStream( (unsigned)HInstance, L"GTX2", RT_RCDATA );



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
InfMag
Дата 2.1.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Alexeis, [BCC32 Error] opengl.cpp(499): E2285 Could not find a match for 'TResourceStream::TResourceStream(unsigned int,const wchar_t *,char *)'

Добавлено через 1 минуту и 14 секунд
Интересное кино, не правда ли? Причём я по этому TRS листал уже, там тоже пишут L"RT_RCDATA" - вместо RT_RCDATA.

Добавлено через 13 минут и 31 секунду
Вот например можно взглянуть как тут решалась данная проблема, мне не помогло: http://forum.vingrad.ru/topic-260478.html
http://forum.vingrad.ru/topic-285798.html - вот тут подгружали иконки, мырулили спец. типом ресурса.
Это только на винграде, где что только не писали, у меня так и не заработало.
Код

#pragma hdrstop

#include <vcl.h>
#include <windows.h>

#include <tchar.h>
#include <stdio.h> // для работы с файлами
#include <math.h>

#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

#include "uc_get_resource.h"

#pragma argsused

Вот собрал все мои прагмы и инклюды. В билдере ресурсы подключаются в проект без прагм. По первой ссылке проблема исключается, у меня тут этого нет.
Уже похоже становится на мистицизм. И колдования с бубном.
PM   Вверх
Alexeis
Дата 2.1.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



InfMag, где-то неправильно объявлена константа RT_RCDATA . Вероятно она определена как TCHAR* у меня в настройках стоит map TCHAR to wchar_t поэтому находит правильно. По умолчанию в проекте стоит map TCHAR to char


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 2.1.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Код

#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE

#ifndef NORESOURCE

/*
 * Predefined Resource Types
 */
#define RT_CURSOR           MAKEINTRESOURCE(1)
#define RT_BITMAP           MAKEINTRESOURCE(2)
#define RT_ICON             MAKEINTRESOURCE(3)
#define RT_MENU             MAKEINTRESOURCE(4)
#define RT_DIALOG           MAKEINTRESOURCE(5)
#define RT_STRING           MAKEINTRESOURCE(6)
#define RT_FONTDIR          MAKEINTRESOURCE(7)
#define RT_FONT             MAKEINTRESOURCE(8)
#define RT_ACCELERATOR      MAKEINTRESOURCE(9)
#define RT_RCDATA           MAKEINTRESOURCE(10)


Не объявлен UNICODE


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
InfMag
Дата 2.1.2011, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Alexeis, но ведь, если взглянуть по приведённой мною ссылке (где Вы вроде даже участвовали), то в завершении решилось там всё через L"RT_RCDATA", а моё:
Код

HRSRC TXS2resh = FindResource( appInstance, "MYJP", RT_RCDATA );
В тоже время прекрасно работает и уживается. В чём секрет?

Добавлено через 7 минут и 39 секунд
Alexeis, я всё же не совсем понял, где не объявлен уникод? И где map проставляется?

Это сообщение отредактировал(а) InfMag - 2.1.2011, 20:29
PM   Вверх
Dem_max
Дата 3.1.2011, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Цитата

Alexeis, я всё же не совсем понял, где не объявлен уникод? И где map проставляется?

итак обобщим что нужно сделать в Directories and Conditionals (в свойствах проекта) добавить  UNICODE; и выставить maps to в wchar_t

UNICODE необходим чтоб сработало это 

Код

#define RT_RCDATA           MAKEINTRESOURCE(10)

#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE


и дальше в коде уже писать нормально

Код

    TResourceStream *TXS2res = new TResourceStream((unsigned int)HInstance, L"MYJP", RT_RCDATA);
    TXS2res->SaveToFile(L"1.jpg");
    delete TXS2res;


Это сообщение отредактировал(а) Dem_max - 3.1.2011, 07:09


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
InfMag
Дата 3.1.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Dem_max, извиняюсь конечно, но так и не понял где там нужно добавлять UNICODE, но зато переставив параметр в D&C _TCHAR map to с char на wchar_t следующий код прекрасно заработал по назначению:
Код

TJPEGImage *JPG = new TJPEGImage;
TResourceStream *RES = new TResourceStream( (unsigned int)hInstance, "JR", RT_RCDATA );

JPG->LoadFromStream( RES );
JPG->SaveToFile("x.jpg");

Всем спасибо и плюс за помощь!

Так у меня теперь вопрос: на что ещё повлияет эта смена map-а? Что-то может рухнуть? Я конечно извиняюсь за неясное понимание глубин языка, я только учусь.

Добавлено через 4 минуты и 2 секунды
О вуаля! Неужели меня этим осенило! Таки до меня дошло и я сделал всё без лишних изменений в свойствах проекта! Взгляните:
Код

TJPEGImage *JPG = new TJPEGImage;
TResourceStream *RES = new TResourceStream( (unsigned int)hInstance, "JR", (System::WideChar*)RT_RCDATA );

JPG->LoadFromStream( RES );
JPG->SaveToFile("x1.jpg");

И всё! TResourceStream побеждён! Что только не пробовал, а до этого не додумался!
PM   Вверх
Dem_max
Дата 4.1.2011, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



ты так и не понял ничего .......
скажи чем сей код 
Код

TJPEGImage *JPG = new TJPEGImage;
TResourceStream *RES = new TResourceStream( (unsigned int)hInstance, "JR", RT_RCDATA );

JPG->LoadFromStream( RES );
JPG->SaveToFile("x.jpg");

отличается от этого ?
Код

TJPEGImage *JPG = new TJPEGImage;
TResourceStream *RES = new TResourceStream( (unsigned int)hInstance, "JR", (System::WideChar*)RT_RCDATA );

JPG->LoadFromStream( RES );
JPG->SaveToFile("x1.jpg");


и ты пришел к ничему ненужному  (System::WideChar*)RT_RCDATA



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
InfMag
Дата 4.1.2011, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


…
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 1
Всего: 4



Dem_max, ну если брать от буквального, то если в настройках проекта не сменить D&C _TCHAR map to с char на wchar_t, то первый пример будет выдавать ошибку, а второй нет.
А пришёл я по-моему как-раз таки к нужному, поскольку хочу написать класс, который не будет требовать для своей работы ни изменения себя, ни изменений в настройках проекта. Где я ошибся? Я просто уточняю тип данных. И не хочу вносить доп. настройки к проекту, если это требуется для единичного места, и которые возможно побочно скажутся в каком-нибудь другом месте к тому же.
P.S. Ну и ещё (я думаю тут это не в счёт), но в первом примере сохранение в файл x.jpg, а во-втором в x1.jpg  smile

Добавлено через 10 минут и 7 секунд
А вообще тип wchar_t, сколько я могу знать предназначен хранить символы юникода.

Это сообщение отредактировал(а) InfMag - 4.1.2011, 21:54
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.