关于提取图标的问题!高手请帮助!!(50分)

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

lfpsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
在以下代码中.如果在"更换图标"对话框中没有使用"浏览"按扭选择其他文件,则取得的
EXE或DLL文件中的图标是正确的,但如果使用了,那么得到的图标就不是想得到的那个了.
请问这个问题可以解决吗?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,shellapi, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

Function SHChangeIconDialog(hOwner:hwnd;szFilename:PwideChar;Reserved:longint; var lpIconIndex:Longint):Longint;stdcall;external 'shell32' index 62;

{$R *.dfm}

function GetIconFromExe(ExeName:String):HIcon;
Var ic:longint;
idx:longint;
Exe:Pwidechar;
begin
getmem(Exe,255);
stringtowidechar(ExeName,Exe,255);
ic:=SHChangeIconDialog(form1.handle,Exe,0,idx);//调用图标更换对话框
if ic<>0 then //成功调用
result:=extracticon(0,pchar(widechartostring(Exe)),idx);
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.Filter := '图标库(*.ico;*.exe;*.dll;*.icl)|*.ico;*.exe;*.dll;*.icl';
if OpenDialog1.Execute then
Image1.Picture.Icon.Handle := GetIconFromExe(Opendialog1.fileName);
end;

end.
 
如果谁帮我解决了这个问题,我还可以给他一个ExpressBar D6带源码的控件!
 
改成下面的:
ic:=SHChangeIconDialog(form1.handle,Exe,127,idx);
就可以了
注意第三个参数 Reserved 其实是指Exe可以返回几个字符的意思,
你设置为0就不返回新的文件名字了。
注意widechar一个字符是2个字节,你才申请255个字节,不能保存255个字符
如果你要保存255个字符,需要申请 (255+1)*2 字节 ,注意字符串结束也需要2个0
 
当然,如果你申请多了内存的话,把刚才的第三个参数 Reserved也改大吧
第三个参数 Reserved 是包括了最后的结束字符(0)的
 
谢谢你!
我还想问你一个问题,如果将255设置为MAX_PATH会有问题吗?
参数 Reserved 又应该是多少最合理呢?
 
MAX_PATH是文件最大字符数,
关键是
getmem 里面是 (MAX_PATH+1)*2
stringtowidechar 里面是 MAX_PATH+1 (getmen的一半)
SHChangeIconDialog里面 Reserved 为 MAX_PATH+1 (getmen的一半)
 
后退
顶部