如何从exe中获得图标的二进制流(50分)

  • 主题发起人 主题发起人 happygb
  • 开始时间 开始时间
H

happygb

Unregistered / Unconfirmed
GUEST, unregistred user!
如何从exe中获得图标的二进制流,这样当文件不存在的时候,也可以从流中取得图标
 
我只知道用../Borland/Delphi6/Demos/ResXplor 编译后的程序可以取出exe里的部分图标
 
这个方法好像不是怎么好,我就想知道有没有方法可以度出EXE的二进制流,就想WINRAR一样,吧exe压缩后,还可以在它的界面里面显示出来已经压缩过的文件的图标
 
可以,完全可以,我以前写过的
代码吗,等我找找看啊
 
多谢了,小第急用,分不够再加
 
procedure TForm1.Button1Click(Sender: TObject);
var
ico_filename:pchar;
hmodule:dword;
ico_n:integer;
begin
if opendialog1.Execute then begin
ico_filename:=pchar(opendialog1.FileName);
hmodule:= GetModuleHandle(ico_filename);
ico_n:= ExtractIcon(hmodule, ico_filename, 0);
Image1.Picture.Icon.Handle:=ico_n;
Image1.Picture.Icon.SaveToFile('g:/downloads/111.ico');
end;
end;
 
to wp231957:
能不能从文件直接取得流信息,然后直接从流来生成图标?按理论上应该事可以的,文件的图标无非就是以二进制的形式存储再文件中,那么应该可以提取图标的二进制来生成图标,WINRAR就是个典型的例子,它里面的文件被压缩以后,文件本身已经不存在了,那么肯定是以某种方式保存了图标二进制流然后在界面使用是生成图标的。
大家来讨论一下。
 
等下我告诉你,如果你熟ShellAPI就行了,不是你想想的那样。
 
不知你有没有看到RAR里压缩每种文件都有图标,其实这些都是系统图标,并非你所想的是从压缩文件的流中读取的。
类似: 通过Shell外壳 http://www.delphibbs.com/keylife/iblog_show.asp?xid=8018

uses ShellAPI, CommCtrl, ShellCtrls;

procedure SetViewImgListHandle(View: TObject; IcoType: TIcoType);
const
AICOType: array[TIcoType]of DWORD = (SHGFI_LARGEICON, SHGFI_SMALLICON, SHGFI_OPENICON);
var
FileInfo: TSHFileInfo;
ImageList_FileList: THandle;
Flags: UINT;
begin
ImageList_FileList := SHGetFileInfo(PChar('C:/'), 0, FileInfo,
sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or Ord(AICOType[IcoType]));
if ImageList_FileList <> 0 then begin
if View is TComboBoxEx then
begin
PostMessage(TComboBoxEx(View).Handle, CBEM_SETIMAGELIST, 0, ImageList_FileList);
end;
if View is TTreeView then
TreeView_SetImageList(TTreeView(View).Handle, ImageList_FileList, 0);
if View is TListView then begin
case IcoType of
itICON: Flags := LVSIL_NORMAL;
itSmallICON: Flags := LVSIL_SMALL;
else Flags := LVSIL_SMALL;
end;
ListView_SetImageList(TListView(View).Handle, ImageList_FileList, Flags);
end;
end;
end;

function GetFileBySystemDefaultIcon(AFileName: string): Integer;
var
shinfo: TSHFILEINFO;
isCreateFile: Boolean;
Flag: Integer;
I: Integer;
Ext: string;
Count: Integer;
begin
Result := -1;
if Trim(AFileName) = '' then Exit;
try
isCreateFile := false;
if not FileExists(AFileName) then
begin
AFileName := GetWindowsTempFolder + '/' + ExtractFileName(AFileName);
if not FileExists(AFileName) then
//这里是创建一个临时文件而已
isCreateFile := FCFileCreate(AFileName);
end;

Flag := (SHGFI_SMALLICON or SHGFI_ICON);
SHGetFileInfo(Pchar(AFileName), 0, shinfo, Sizeof(shinfo), Flag);
Result := shinfo.iIcon; //只须取得ICO的Index就行了。系统已经把所有图标装载
if isCreateFile then
//删除临时文件
DeleteFile(pchar(AFileName));
except
on E: Exception do
UpdateStatusBar(5, 'GetFileBySystemDefaultIcon: ' + E.Message);
end;
end;


//调用
type
TIcoType = (itICON, itSmallICON, itStateICON);
SetViewImgListHandle(ListView1, itSmallICON);

fileName := ListView1.selected.caption;

ListView1.selected.ImageIndex := GetFileBySystemDefaultIcon(fileName );
 
to jfyes:
是的,我搞错了,WINRAR对EXE是没有图标显示的,你的方法我试过了,是可以的,我还象知道,除了创建临时文件,能不能直接通过类型去获得图标呢?好像WINRAR没有见创建临时文件
 
刚才我试了一下,如果速度快基本上可以看不见临时文件,谢谢大家了,现在给分,如果能不创建临时文件更好,大家有方法麻烦发给我一份。
 
后退
顶部