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;ResIDAnsiChar);
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;
它是存在ntoskrnl.exe里的一张位图组成的。
它的特点是用ResHacker打开看到其是一张全黑的位图。但是如果将它提取出来,
用PhotoShop打开,载入一个颜色表*.pal它的画面就显示出来了。
我想在Delphi中也显示出来,不知道应该如何实现呢?
有可能实现吗?
2、
我用
BeginUpdateResource
UpdateResource
EndUpdateResource
将该文件的图片更新到另一个文件中。
有一些文件能成功,但有些就不行了,更新后图像的颜色变了。
这是什么原因呢?
代码如下:
procedure ChangeBmpFormExe(FileName:String;ExeFileName:String;ResIDAnsiChar);
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;