Большая проблема.
Вот при написании одной очень полезной программы я столкнулся некоторыми проблемами.
Проблемы это такие:
1. У меня в программе есть reg.dll в нем есть String-Table, я загружаю
нужный мне String(Функцией LoadString) здесь все порядке, но для регистрации
мне нужно изменить этот String, но у меня это не получается.
2. Этаже проблема и с BITMAP пробовал пользоваться BeginUpdateResource,UpdateResource,EndUpdateResource
но вместо нужного мне BITMAPa в ресурс сохраняется какая то шняга!
На этом проблемы заканчиваются.
Подскажите, пожалуйста, как их решить!
Спасибо за внимание!
P.S.: Заранее благодарю!
1. Я использовал этот код:
var
DLL: Cardinal;
Text: array[0..255] of char;
begin
DLL:= LoadLibrary('res.DLL');
LoadString(dll,110,@Text,sizeof(Text));
Edit1.Text:= StrPas(Text);
end;
Тут всё работает, но мне нужно на оборот, чтобы Edit1.Text сохранялся в ресурс, но в Delphi нет функции SaveString!
2. Здесь я использовал этот код:
var
BMP: TFileStream;
S,F: Cardinal;
begin
BMP:= TFileStream.Create('H:\new1.bmp',fmOpenRead);
S:= BMP.Size;
F:= BeginUpdateResource('H:\reg.dll',False);
UpdateResource(F,RT_Bitmap,'New',0,BMP,S);
EndUpdateResource(F,False);
end;
По идеи должно работать но, не работает!
Появились еще проблемы:
3. Использование PNG. Часа 2 по сети лазал ни одного компонента не нашел!
Спасибо за внимание!
P.S.: Заранее благодарю!
var
BMP: TFileStream;
S,F: Cardinal;
begin
BMP:= TFileStream.Create('H:\new1.bmp',fmOpenRead);
S:= BMP.Size;
F:= BeginUpdateResource('H:\reg.dll',False);
UpdateResource(F,RT_Bitmap,'New',0,BMP,S);
EndUpdateResource(F,False);
end;
Допустим, вместо TFileStream можно использовать TMemoryStream. А если попробывать использовать TBitmap.LoadFrom<...>?
Допустим, вместо TFileStream можно использовать TMemoryStream. А если попробывать использовать TBitmap.LoadFrom<...>?
Не понял?
Дополнение:
2. Здесь я использовал этот код:
var
BMP: TFileStream;
S,F: Cardinal;
begin
BMP:= TFileStream.Create('H:\new1.bmp',fmOpenRead);
S:= BMP.Size;
F:= BeginUpdateResource('H:\reg.dll',False);
UpdateResource(F,RT_Bitmap,'New',0,BMP,S);
EndUpdateResource(F,False);
end;
По идеи должно работать но, не работает!
Батенька, дык ты мануал по UpdateResource читал?
Там что про пятый параметр (lpData) сказано? Указатель на данные битмапа! А ты ему что суешь? Указатель на VCL-класс TFileStream, который тебе вернул конструктор! Ты должен узнать размер потока (BMP.Size), выделить память (GetMem), в нее считать данные из файла (BMP.ReadBuffer), и указатель на этот участок памяти передать в UpdateResource! Ну и под конец освободить ранее выделенную память (FreeMem). Также не лишним было бы проверять вызовы функций на ошибки и использование Try..Finally при работе с памятью и ресурсом.
Вот так-то.
Батенька, дык ты мануал по UpdateResource читал?
Там что про пятый параметр (lpData) сказано? Указатель на данные битмапа! А ты ему что суешь? Указатель на VCL-класс TFileStream, который тебе вернул конструктор! Ты должен узнать размер потока (BMP.Size), выделить память (GetMem), в нее считать данные из файла (BMP.ReadBuffer), и указатель на этот участок памяти передать в UpdateResource! Ну и под конец освободить ранее выделенную память (FreeMem). Также не лишним было бы проверять вызовы функций на ошибки и использование Try..Finally при работе с памятью и ресурсом.
Вот так-то.
Привет AviDen спасибо за то, что сказал, где у меня ошибка.
Но у меня проблема с BMP.ReadBuffer что там надо указывать
в качестве второго параметра (Count)???
Спасибо за внимание!
Привет AviDen спасибо за то, что сказал, где у меня ошибка.
Но у меня проблема с BMP.ReadBuffer что там надо указывать
в качестве второго параметра (Count)???
Спасибо за внимание!
Количество байтов, которое необходимо считать из буфера (вдруг тебе нужна только часть данных). В твоет случае это - BMP.Size.
Количество байтов, которое необходимо считать из буфера (вдруг тебе нужна только часть данных). В твоет случае это - BMP.Size.
У меня вылазеет Ошибка "Stream read eroor"!!!
p.s.:Код у меня такой:
var
BMP: TFileStream;
S,F: Cardinal;
P: pointer;
begin
BMP:= TFileStream.Create('H:\new.bmp',fmOpenRead);
S:= BMP.Size;
GetMem(P,S);
bmp.ReadBuffer(P,S);
F:= BeginUpdateResource('H:\1.exe',False);
UpdateResource(F,RT_BITMAP,'New',0,P,S);
EndUpdateResource(F,False);
Freemem(P,S);
У меня вылазеет Ошибка "Stream read eroor"!!!
p.s.:Код у меня такой:
var
BMP: TFileStream;
S,F: Cardinal;
P: pointer;
begin
BMP:= TFileStream.Create('H:\new.bmp',fmOpenRead);
S:= BMP.Size;
GetMem(P,S);
bmp.ReadBuffer(P,S);
F:= BeginUpdateResource('H:\1.exe',False);
UpdateResource(F,RT_BITMAP,'New',0,P,S);
EndUpdateResource(F,False);
Freemem(P,S);
ээх, батенька, что ж ты так!
А нужно так:
bmp.ReadBuffer(P^,S);
ээх, батенька, что ж ты так!
А нужно так:
bmp.ReadBuffer(P^,S);
Большое спасибо тебе AviDen твои советы мне ОЧЕНЬ помогли!
p.s.:Ты случайно незнаеш как с помощью этих функций можно изменять STRING-TABLS? Или есть другие функции специально для этих целей???
Спасибо за внимание!
Большое спасибо тебе AviDen твои советы мне ОЧЕНЬ помогли!
p.s.:Ты случайно незнаеш как с помощью этих функций можно изменять STRING-TABLS? Или есть другие функции специально для этих целей???
Спасибо за внимание!
Ну, дык если речь идет о строковых ресурсах - точно так же. Только все строки должны быть Unicode - в Delphi WideString. Т.е., что-то типа
UpdateResource(UpdateHandle, RT_STRING, 'Resource_Name', 0, @(MyString[1]), Length(MyString) * 2);
Ну, дык если речь идет о строковых ресурсах - точно так же. Только все строки должны быть Unicode - в Delphi WideString. Т.е., что-то типа
UpdateResource(UpdateHandle, RT_STRING, 'Resource_Name', 0, @(MyString[1]), Length(MyString) * 2);
Он у меня записывается под фонарным ID :( , и удаляет остальные строки из этого ресурса!
:( :( :(
Он у меня записывается под фонарным ID :( , и удаляет остальные строки из этого ресурса!
:( :( :(
Значит, нужно пихать туда всю кучу, наверное...
Но тут я уже не шарю - сорри...