卷起千堆雪tyn,来看看好吗? (100分)

  • 主题发起人 主题发起人 lfpsoft
  • 开始时间 开始时间
L

lfpsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
1、有研究过WinXP的启动画面吗?
它是存在ntoskrnl.exe里的一张位图组成的。
它的特点是用ResHacker打开看到其是一张全黑的位图。但是如果将它提取出来,
用PhotoShop打开,载入一个颜色表*.pal它的画面就显示出来了。
我想在Delphi中也显示出来,不知道应该如何实现呢?
有可能实现吗?
2、
我用
BeginUpdateResource
UpdateResource
EndUpdateResource
将该文件的图片更新到另一个文件中。
有一些文件能成功,但有些就不行了,更新后图像的颜色变了。
这是什么原因呢?
代码如下:
procedure ChangeBmpFormExe(FileName:String;ExeFileName:String;ResID:PAnsiChar);
var
hResLoad:HRSRC; // handle to loaded resource
hExe:THANDLE; // handle to existing .EXE file
hRes:HRSRC; // handle/ptr. to res. info. in hExe
hUpdateRes:THANDLE; // update resource handle
lpResLock:^char; // pointer to resource data
begin
hExe := LoadLibrary(PChar(ExeFileName));

hRes := FindResource(hExe, ResID, RT_Bitmap);


hResLoad:= LoadResource(hExe, hRes);


lpResLock:= LockResource(hResLoad);


hUpdateRes:= BeginUpdateResource(Pchar(FileName), FALSE);


if not UpdateResource(hUpdateRes, // update resource handle
RT_BITMAP, // change Icon resource
ResID, // Icon name
GetFileInfo(FileName), // neutral language
lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)) // size of resource info.
then ShowMessage('不能向目标文件写入数据.');

if (not EndUpdateResource(hUpdateRes, FALSE)) then ShowMessage('错误.');


FreeLibrary(hExe);
end;

但是如果从BMP文件中读入数据再更新发再BMP是倒入了,但是程序将不能再运行,
会出错,估计是BMP在资源和在文件中有些地方是不同的吧。代码如下:
procedure ChangeBmpFromFile(FileName:String;BmpFileName:String);
Var
hUpdateRes : THANDLE; // update resource handle
bOK: Boolean;
Stream:TMemoryStream;
Bmp:TBitmap;
Begin

stream:=TMemoryStream.Create ;

Bmp := TBitmap.Create ;
if FileExists(BmpFileName) then
Bmp.LoadFromFile(BmpFileName);
bmp.SaveToStream(stream);

if Stream.Memory = nil then
begin
ShowMessage('不能读到'+bmpFileName+',请检查文件是否存在.');
exit;
end;

hUpdateRes := BeginUpdateResource(PChar(FileName), FALSE);
if hUpdateRes =0 then
begin
ShowMessage('不能打开'+FileName+',请检查文件是否存在.');
exit;
end;


if not UpdateResource(hUpdateRes, // update resource handle
RT_BITMAP, // change dialog box resource
Pchar(1), // dialog box name
GetFileInfo(FileName), // neutral language
Stream.Memory, // ptr to resource info
Stream.Size) then ShowMessage('不能向目标文件写入数据.');


if not EndUpdateResource(hUpdateRes, FALSE) then ShowMessage('错误.');



stream.Free ;
bmp.Free ;
end;


 
// 有一些文件能成功,但有些就不行了,更新后图像的颜色变了。
可能是你没有保存它的调色板,如果你确定保存了调色板,那可能是它使用了自己
的调色板机制:(

纯属猜测……[:D]

 
卷起千堆雪
哪里去了?怎么还不进来?
 
风潇潇兮易水寒,壮士一去兮不复返
 
唉,如何是好???????
 
真是等你等到我心痛呀!
 
他说了工作忙,不来了
 
多人接受答案了。
 
lfpsoft:
你好!
看到你的代码,想请教2个问题?
1.ResID 资源ID如何取?
2.GetFileInfo函数是如何定义的?
谢谢指教!
 
后退
顶部