由TShellListView引出的64位程序错误

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文件,完美!第二次,崩溃。我也是崩溃了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值