非常感谢大家的关注!!!不过还是期盼着高手的到来!!! (200分)

  • 主题发起人 主题发起人 HD_Copy
  • 开始时间 开始时间
我在昨天已經回覆給你了
看來你沒有看到
再說一次
>>>
這應該是個Windows的小Bug
你只要把SHGetFileInfo的最後一個參數改成 SHGFI_TYPENAME or SHGFI_ATTRIBUTES, 如下:
SHGetFileInfo(PChar(CurrentPath+sr.Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_TYPENAME or SHGFI_ATTRIBUTES);
就完全正常了!
<<<<

 
to lorderic
其实不像您所想的那样,上面早就有人说过了您的那种方法
但是事实上仅仅对于参数是C:/winnt/system32/目录好使,当你换成别的目录的话
也许又出现了怪问题。反正我这里是这样的,您那里呢???
对于参数为任何目录您的方法都好用么?
 
to lorderic:
lorderic老大的话我怎么会没看见呢!只不过在我这里,用你的方法没有任何作用啊,故障依旧啊。
(任何目录都没用)

期盼着高手的到来!!!!!!!!!!!!!!!
 
hehe,lorderic的方法对我的机器有效,看来每个系统对此情况出现的问题都可能不一样。
我还是认为这是 shell32.dll 本身的问题,MS的东西有些bug不足为奇。
 
的确是有问题的,与shell32.dll没有关系,我想可能是大家没有明白HD_Copy的意思,哈哈。

要知道,按Button2也能出东西,不过有一些空行。——那是未知的文件名。这与先按Button1
的效果不同。大家再看看是不是这样。:)

晚上要出门,明天再说查错的事吧。:)
 
我曾尝试调用SelectDirectory过程中使用到的一些于shell有关的过程,如ShellMallo
GetDesktopFolder等,试图让系统(Win2k)将可能没有初始化到的信息信息初始化,都
失败了。最近在封闭开发,没有太多的时间来细细研究此处问题,但这决对是2k与9x
不兼容的一个表现,而不关Delphi的事!
 
我这里也没问题,
不过你的那句,
if (sr.Attr<>faDirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
最好写成:
if ((sr.attr and faDirectory)<>0 ) and (sr.Name<>'.')and(sr.Name<>'..') then
 
HDCopy, 我用了很长的时间来查找(而不是分析)代码,哈哈,因为我认为应该不是你的程序
的问题。现在算是有些眉目了。

首先,我将Button1.onClick中调用的SelectDirectory()从FileCtrl.pas中提取出来,然后
将其中无用(不造成影响)的代码逐行清除。最后,我得到了这样的一个过程:
procedure SelectDirectory;
var
BrowseInfo: TBrowseInfo;
begin
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
ShBrowseForFolder(BrowseInfo);
end;

接下来,我只要在Button2.onClick中调用一下这个过程,而不管操作中选择"确定"或者
"取消",Button2中的SearchFiles('C:/WinNT/System32')调用的结果都是正常的。

而ShBrowseForFolder的实现在ShlObj.pas中就只有一行:
function SHBrowseForFolder; external shell32 name 'SHBrowseForFolderA';

于是,我开始认定这不是一般的程序/流程错误,可能是OS有关。

所以,接下来的工作我就是开始查Google了。
我找到了这样的一份文档:
http://www.dcjournal.com/gooey/sysimage.htm
从它的下载包中,我找到了一个可执行程序,用来实现HDCopy要的功能,这个下载包在:
http://www.dcjournal.com/ftp/gooey/sysimage.zip

然而,我在Windows 2K中运行这个DEMO,我发现与HDCopy出现了完全同样的错误,接下
来,我又在vmWare的虚拟Windows 98中测试,发现一切又正常了。参见下面这两个图:
http://aiming.ynxx.com/myUpload/Test_Win98.jpg
http://aiming.ynxx.com/myUpload/Test_Win2K.jpg

哈哈,我想我不需要再解释,至少原因已经找到了,这个Windows OS版本间的Shell32.DLL
不兼容导致的。

就目前而言,只能分析到这儿,下面我去查查MSDN的新版本,在Windows 2000的Shell32.DLL
说明中应该有相关的内容。
HDCopy可以自己查查,我手边没有新版的MSDN,我只能查MSDN Online。:(
 
没问题!
你的系统有问题吧!入安全模式再运行程序试试
 
微软的知识库(Q236376)中提到,在NT4和Windows 2000上,ShGetFileInfoA调用
ShGetFileInfoW,但是在把ShFileInfoA结构转换到ShFileInfoW结构时没能正确
地把dwAttributes转换过去,dwAttributes是一个未初始化的值。稍微联想一下,
可能在某个特定情况下,文件类型说明也没能正确转换过去(谁知道呢?:)。

微软提出的解决办法是直接调用ShGetFileInfoW。试一下吧,还不行的话只好简
单地绕过这个问题了:)。

微软的知识库文章(Q236376)地址:
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q236376
 
非常感谢skyweb!!
但是,我做了如下的修改,可还是不行啊!

void __fastcall TForm1::SearchFiles(AnsiString CurrentPath)
{
TSearchRec sr;
TSHFileInfoW FileInfo; // ---> 这里
int iFound;
wchar_t* P; // ---> 这里

iFound = FindFirst(CurrentPath + "*.*", faAnyFile, sr);
while( iFound == 0 )
{
if( (sr.Name != ".") && (sr.Name != "..") && ((sr.Attr & faDirectory) != faDirectory) )
{
P = StringToOleStr(CurrentPath+sr.Name); // ---> 这里
SHGetFileInfoW(P, 0, &FileInfo, sizeof(FileInfo), SHGFI_TYPENAME);
ListBox1->Items->Add(FileInfo.szTypeName);
}
iFound = FindNext(sr);
}
FindClose(sr);
}
 
在xp里没有问题
 
这个问题,我没碰到过,不知道如何解决,抱歉
 
Win98中没问题。

估计是OS的问题,如果不是bug,就是ansi与unicode之间的匹配问题。最近在研究
RxRichedit的中文查找问题时就发现,不仅RxRichedit本身,包括Delphi的许多函数
或过程都存在仅仅支持Ansi,而不支持Unicode。经过查找MSDN,分析源码,才得以
逐步解决。
所以,对你的问题,我觉得并不奇怪。钢筋水泥再好,在一个破烂的、到处打补丁、
到处被白蚁和病毒攻击的基础上,能造出“金茂大厦”吗?答案是:
不——(此处拖一个长音)能!
 
to kthy:
多谢老大的分析,不过可以肯定的是你所说的和我这个问题毫无关系,不过,还是谢谢你
 
我测试了一下,在我的机器上存在你描述的问题

而且, 如果将 SelectDirectory 过程中这一行删除
ItemIDList := ShBrowseForFolder(BrowseInfo);

那么你描述的问题就一直存在
看来是在 ShBrowseForFolder 中初始化了什么东西?
应该是Windows的问题,与Delphi 无关


还在继续研究,先报告这么多
 
我的环境

Win2000 + D6 update 2
 
win98 delphi5 没问题!
 
在Win2k Professional sp2+Delphi 6下编译

Win2k Professional 和 Win2k Advance Server 下有问题。
Win98se(2222a) 和 WinXP Profession 下正常。

这应该是Windows的问题.
 
同意楼上的,这好象和你使用的windows版本有关,
我虽然帮不上你,可delphi问题多多,真烦!!!
 
后退
顶部