TShellListView 安装
delphi Xe版本虽然没有自动安装TShellListView控件,但可以手动安装。source\vcl目录下可以找到以下两个文件:
ShellCtrls,Vcl.Shell.ShellConsts,然后建立一个安装包,带上这两个文件,编译,安装,完成。按老习惯,我将它放入了Samples中:
错误的出现
新建一个项目,使用TShellListView,32位程序正常(FORM中只放这一个控件)。当增加64位程序时,噹、噹、噹几声敲的脑壳痛:
好家伙,错误定位的地方,让你放弃一切想法:
Vcl.Controls,Message,CallWindowProc,它是谁,从哪里来的,要到哪里去???这谁知道呀。网上找了一天,也没有找到相关的东西,只有教你怎么安装TShellListView的,并且还有水字的嫌疑。看看我上面的多简单明了。
查找并解决错误
常规的、简单的方法无法查找到错误发生的原因,只有用最笨的方法了。
重写一下TShellListView,如果有可能,本人控件是不是也出来了,嘿嘿嘿……
新建一个项目,注意是项目,不是直接写控件,直接写不好调试。然后开始拷贝TCustomShellListView代码。
我不是程序猿,我只是代码的搬运工。
我运气很好,搬了100行左右代码问题出现:
TForm1 = class(TForm)
ListView1: TListView;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FRoot,
FOldRoot: TRoot;
FFolders: TList;
FRootFolder: TShellFolder;
FObjectTypes: TShellObjectTypes;
FLargeImages,
FSmallImages: Integer;
public
………
procedure TForm1.FormCreate(Sender: TObject);
var
FileInfo: TSHFileInfo;
begin
FFolders:= TList.Create;
FRootFolder := nil;
FRoot := SRFDesktop;
FRootFolder := CreateRootFolder(FRootFolder, FOldRoot, FRoot);
FSmallImages :=SHGetFileInfo('C:\', { Do not localize }
0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
FLargeImages := SHGetFileInfo('C:\', { Do not localize }
0, FileInfo, SizeOf(FileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
SendMessage(ListView1.Handle,LVM_SETIMAGELIST, LVSIL_NORMAL, FLargeImages);
//是它,是它,就是它: SendMessage
end;
加上SendMessage时,64位程序出错!!这属于直接定位了。没得跑了,错误号都一样。SendMessage函数中只有一个参数是嫌疑犯:FLargeImages:Integer。把它改为int64,64位程序嘛,管它三七二十几的。
于是我看到光!!
将Vcl.Shell.ShellCtrls.pas中代码改了:FLargeImages, FSmallImages: int64;//Integer;
我成功了!
SendMessage,64位程序一定要注意这个家伙!
-----------------------以下为补充内容------------------------------------
程序运行中又又又发现一个BUG,32位系统菜单调用没问题,但64位调试时,鼠标先不停转圈,然后再报错。没办法水平有限,直接关了系统菜单:AutoContextMenus := false; 就这样先用着吧。
delphi的64位程序还有更操蛋的地方,调用pdfium64.dll,第一次读取PDF文件,完美!第二次,崩溃。我也是崩溃了!