用pchar就出错,用string就没事,为什么?(100分)

  • 主题发起人 wddelphi
  • 开始时间
多谢lqy,我先回家,到家再试。
 
sorry ﹐正確的在下面

procedure TForm1.Button1Click(Sender: TObject);
var
BI:browseinfo;
IDLt:pointer;
ShellMalloc: IMalloc;
str1:pchar;
begin
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
fillchar(bi,sizeof(browseinfo),0);
BI.hWndOwner := Handle
BI.iImage :=0;
BI.lParam :=0;
BI.lpfn :=nil;
BI.lpszTitle :='aaaa:';
BI.ulFlags :=BIF_RETURNONLYFSDIRS
IDLt := SHBrowseForFolder(BI);
if assigned(IDLt) then
Begin
str1:=ShellMalloc.alloc(MAX_PATH);
SHGetPathFromIDList(IDLt,str1);
Edt_Dir.Text:=string(str1);
ShellMalloc.Free(str1);
end;
end;
end;
 
多谢lqy,但IMalloc是什么,要use什么?程序不通过!
 
use ActiveX
IMalloc 是ms提供的一個為指針分配內存的接口


 
多谢lqy,但我用这段程序,最多也只能得到272个字符长度的路径,而windows的路径却
可超过这个长度,所以,程序可能会取到错误的路径。难道不能消除最大长度的限制吗?
 
用StrPas()转换一下就行!
 
目录结构一:
C:/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890
目录结构二:
C:/1234567890/啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊1

各位好,我做了试验,其实是没有办法的,因为(我猜)browseinfo结构就只能存储260个
字节,如下:
unit Windows;
……
const
MAX_PATH = 260;
{$EXTERNALSYM MAX_PATH}

所以windows应该会将路径的长度控制在260以内(如在“目录结构一”的最内层目录内就
无法再建目录了),这样程序就不会得到错误的路径了,但实际上,我们是可以建长度超
过260字节的目录的(如“目录结构二”),那样,程序就无法得到正确的路径了,即使
是MS的软件如Word,我在“目录结构一”下建立了一个文本文件:“新建 文本文档.txt”,
然后要想再建个文本文件就不行了,因为“新建 文本文档 (2).txt”写不下了,同样也
无法建word文档,因为新建的word文档的名称是“新建 Microsoft Word 文档.doc”,也
写不下,我将“新建 Microsoft Word 文档.doc”重命名为“Word 文档.doc”,拷到“
目录结构一”下,双击,打不开,提示错误“找不到此文件 (C:/1234567890/1234567890/.../Word 文档.d)”,
可怪的是,“目录结构一”下的“新建 文本文档.txt”却可通过双击打开。
但以上不能的操作在“目录结构二”下却全然没有问题,呵呵呵,看来,和目录的层次似乎也有关。

另外,我也试了OpenDialog,同样,取不到大于260字节的全路径,看来要靠MS提供的方法取
长路径是不可能的了,只好祈祷,不要有这么变态的目录结构了!

呵呵呵,罗里罗嗦说了这么多,一会儿就发分!
 
呵呵呵,就是删除我刚才建的c:/1234567890/目录也出了这样的提示:
“文件夹“1234567890”中包含名称过长的项目。是否永久删除该项?”
 
我猜也是這個原因﹐可以做個測試在資源管理器中﹐
改一個目錄名稱﹐按下a不放﹐到一定的時侯﹐就按不下去了。
不過奇怪的是﹐這時侯在這個目錄下﹐還是可以建新目錄或文件的
 
惨了惨了,要删除那个目录,按了“确定”按钮,结果现在explorer死了,explorer.exe
的CPU占用99,幸好是win2000,win98早死了!

这是不是windows的BUG啊!
 
发分了!
 
顶部