Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > LoadResourсe


Автор: Crut 10.1.2008, 11:32
На форме 3 обьекта:
Код

        TMemo *File;
        TButton *Button1;
        TButton *Button2;


Кнопка 1 загружает в ресурсы "a.exe" текст из File:
Код

 void __fastcall TForm1::Button1Click(TObject *Sender)
{
void * hUpdate = BeginUpdateResource("a.exe",false);
char * text = new char[File->Text.Length()];
text = File->Text.c_str();
UpdateResource(hUpdate,"RT_RCDATA","LIBRARY",0, (LPVOID)text, File->Text.Length());
delete [] text;
EndUpdateResource(hUpdate, false);
}
//---------------------------------------------------------------------------

 

А кнопка2 должна загрузить из ресурсов "a.exe" файл в File. Но как это реализовать??
Заранее благодарен...  smile 

Автор: SenkraD 10.1.2008, 13:14
Crut, в Builder есть удобная оболочка TResourceStream,
поищи - примеров куча как на форуме так и в нете вцелом


Автор: artsb 10.1.2008, 13:24
Вместо этого:
Код

text = File->Text.c_str();

лучше так:
Код

strcpy(text, File->Text.c_str());

А по поводу загрузки и выгрузки ничего сказать не могу. Сам создавал такой топик, но никто не ответил. :(

Автор: Crut 11.1.2008, 11:12
Цитата(SenkraD @  10.1.2008,  13:14 Найти цитируемый пост)
Crut, в Builder есть удобная оболочка TResourceStream,
поищи - примеров куча как на форуме так и в нете вцелом

Искать - это время надо, а мне позарез. Можно пожалуйста хорошую ссылку...

Автор: Crut 11.1.2008, 11:43
Код

void * hUpdate = BeginUpdateResource("a.exe",false);
char * text = new char[File->Text.Length()];
text = File->Text.c_str();
  TResourceStream *aa = new
 TResourceStream((int)hUpdate,AnsiString("LIBRARY"),RT_RCDATA);
 aa->Write(text, 0);
delete [] text;
EndUpdateResource(hUpdate, false);


Компилица запускаится, а когда я нажимаю на кнопку, выдаёт, что ресурс "LIBRARY" ненайден. Что делать??

Автор: artsb 11.1.2008, 12:09
Из справки:
Цитата

In the first constructor syntax, the ResName is the string associated with the resource in the .RC file that was compiled with the application. If the resource is associated with an integer ID rather than a string, use the string representation of the integer after a pound sign (#), or use the second constructor syntax. Thus, for example, a resource with an integer identifier of 128 be identified by a ResName of #128. when invoking the first constructor syntax, or by a ResID of 128 when invoking the second constructor syntax.

А ты загружал до этого ресурс "LIBRARY"?

Автор: Crut 11.1.2008, 12:17
???

Автор: artsb 11.1.2008, 12:30
Цитата(Crut @  11.1.2008,  12:17 Найти цитируемый пост)
???

Судя по справке, "LIBRARY" уже должна существовать в ресурсах.

Автор: Crut 11.1.2008, 14:27
А как можно такой ресурс в ехешнике сделать??

Автор: artsb 11.1.2008, 14:37
Либо подключить к проекту файл ресурса *.res.
Либо добавить свои ресурсы к файлу Project1.res, созданному автоматически (не рекомендуется!).

Автор: Crut 11.1.2008, 14:49
Пофигу. Создал я rc файл:
LIBRARY RT_RCDATA a.txt

Скомпилил, добавил в проект, попробовал - опять не находит!

Автор: artsb 11.1.2008, 15:13
А ты его добавил к a.exe? Ведь ты с этим файлом работаешь.

Автор: Crut 11.1.2008, 15:17
brcc32 a.rc a.exe
И так сделал - пофигу...

Автор: xvr 11.1.2008, 15:31
Цитата(Crut @ 11.1.2008,  11:43)
Код

void * hUpdate = BeginUpdateResource("a.exe",false);
char * text = new char[File->Text.Length()];
text = File->Text.c_str();
  TResourceStream *aa = new
 TResourceStream((int)hUpdate,AnsiString("LIBRARY"),RT_RCDATA);
 aa->Write(text, 0);
delete [] text;
EndUpdateResource(hUpdate, false);


Компилица запускаится, а когда я нажимаю на кнопку, выдаёт, что ресурс "LIBRARY" ненайден. Что делать??

Тебе надо загрузить твой a.exe как библиотеку, и ее инстанс подавать в TResourceStream. BeginUpdateResource выдает не тот инстанс. См LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE

Автор: Crut 11.1.2008, 15:44
Ща попробуем...

Добавлено через 10 минут и 48 секунд
Код

HANDLE  hUpdate = LoadLibrary("a.exe");
char * text = new char[1000];
 TResourceStream *aa = new
 TResourceStream((int)hUpdate,AnsiString("LIBRARY"),"RT_RCDATA");
 aa->Read(text,sizeof(AnsiString));
 File->Text = text;
free(hUpdate);

Гы)) Терь Access Violation и указывает на kernel32.dll...
А еще открыват файл  GETMEM.inc и ругается на строку 1066!
Кстати хоть брешет, но загружает))
И вот маленький вопрос: TResouceStream->read(void,int) что вводить в int, если неизвестен размер строки?

Добавлено через 13 минут и 31 секунду
LoadLibraryEx тоже...

Автор: xvr 11.1.2008, 22:28
Цитата(Crut @ 11.1.2008,  15:44)
Ща попробуем...

Добавлено @ 15:55
Код

HANDLE  hUpdate = LoadLibrary("a.exe");
char * text = new char[1000];
 TResourceStream *aa = new
 TResourceStream((int)hUpdate,AnsiString("LIBRARY"),"RT_RCDATA");
 aa->Read(text,sizeof(AnsiString));
 File->Text = text;
free(hUpdate);

Гы)) Терь Access Violation и указывает на kernel32.dll...
А еще открыват файл  GETMEM.inc и ругается на строку 1066!
Кстати хоть брешет, но загружает))
И вот маленький вопрос: TResouceStream->read(void,int) что вводить в int, если неизвестен размер строки?

Вот поэтому и Access Violation  smile sizeof(AnsiString) это 4. TResourceStream это обычный стрим, соотвественно и читать из него надо например побайтно.

Автор: Crut 12.1.2008, 10:37
А что делать, если я не знаю сколько байтов мне необходимо из текста??

Автор: artsb 12.1.2008, 10:50
А если как-то так:
Код

HANDLE  hUpdate = LoadLibrary("a.exe");
AnsiString text;
char temp;
 TResourceStream *aa = new
 TResourceStream((int)hUpdate,AnsiString("LIBRARY"),"RT_RCDATA");
while(aa->Read(temp,1)
 {
    text+=temp;
 }
 File->Text = text;
free(hUpdate);

Не уверен конечно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)