filename必须用Pchar,你要初始化!因为FileName要返回文件名的!
var
  filename:array[0..MAX_PATH] of char;
  strpcopy(filename,'d:\winnt\....');
 .....
这样就没有问题了。
因为在那个Dialog中可以用[浏览]改变文件名的,你必须接收这个文件名啊。

解决方案 »

  1.   

    不行啊,我试过了,问题依旧.我一开始的做法是把filename强制转换为pchar类型,应该也是可以的呀.
      

  2.   

    有鬼了!下面的代码不行吗?至于文件找不到,那时因为你的文件不存在。
    function PickIconDlgA(OwnerWnd: HWND; lpstrFile: PAnsiChar; var nMaxFile: LongInt;var lpdwIconIndex: LongInt): LongBool; stdcall; external 'SHELL32.DLL' index 62;procedure TForm1.Button1Click(Sender: TObject);
    var
      buf:array[0..MAX_PATH] of char;
      n,index:integer;
    begin
      buf:='c:\windows\explorer.exe';
      PickIconDlgA(handle,buf,n,index);
      showmessage(string(buf)+','+inttostr(index));
    end;
      

  3.   

    >>我一开始的做法是把filename强制转换为pchar类型,应该也是可以的呀. 
    自己没有搞懂,这样转换,是不能接受返回值的,只是把string里面的字符串变成了一个Pchar常量而已,string并没有变成pchar!
      

  4.   

    http://kingron.myetang.com/tools.pas.txt
      

  5.   

    这个是没有公开的API,该死的M$改变了接口!原来如此!我说呢~~~~~~~~~~~~~
      

  6.   

    要用MultiByteToWideChar和WideCharToMultiByte来转换
      

  7.   

    实际上,那个API的声明的第三个参数是系统保留的,有可能系统改变了参数的顺序之类的。只有自己摸索了,如果你有兴趣,可以用SoftIce跟踪这个API,看看它的调用堆栈就可以了。这个API也是人家摸索出来的,如果你自己不想麻烦,就只有到网络上面去寻找资料了。或者去Borland新闻组问一下,也许有答案。如果能够出来那个Dialog,那么一定参数变了!
      

  8.   

    在9X和ME中应该都没问题,
    因为不是UNICODE,NT则行不通.