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

  • 主题发起人 主题发起人 HD_Copy
  • 开始时间 开始时间
我也在我的计算机里试过了,一切通过呀,没问题的,你的os有问题了。
我穷死了,快给分把,哈哈。
 
你生成的exe没问题呀。
 
也许与某个个性化的设置有关,我的计算机上发现了同样的问题,实在不行的话就到注册表
中自己查,.....
 
应该不是delphi的问题,我用VC试验了一样出问题,看来最可能就那个
系统核心模块 shell32.dll的问题了,hehe.

// delphierrorDlg.cpp : implementation file
//

#include "stdafx.h"
#include "delphierror.h"
#include "delphierrorDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDelphierrorDlg dialog

CDelphierrorDlg::CDelphierrorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDelphierrorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDelphierrorDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDelphierrorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDelphierrorDlg)
DDX_Control(pDX, IDC_LIST2, m_list);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDelphierrorDlg, CDialog)
//{{AFX_MSG_MAP(CDelphierrorDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDelphierrorDlg message handlers

BOOL CDelphierrorDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CDelphierrorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDelphierrorDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CDelphierrorDlg::SearchFiles(CString CurrentPath)
{
CFileFind myfind;
BOOL isfind = myfind.FindFile(CurrentPath+"*.*");
SHFILEINFO sfi;
CString fname;
CString mytype;
m_list.ResetContent();

while (isfind)
{
isfind = myfind.FindNextFile();
fname = myfind.GetFileName();

if (!(myfind.IsDirectory()))
{
SHGetFileInfo((LPCTSTR)CurrentPath+fname,0,&sfi,sizeof(SHFILEINFO),SHGFI_TYPENAME);
mytype.Format("%s",sfi.szTypeName);
m_list.AddString(mytype);
}
}

}

void CDelphierrorDlg::OnButton2()
{
// TODO: Add your control notification handler code here

SearchFiles("E://Winnt//system32//");


}

void CDelphierrorDlg::OnButton1()
{
// TODO: Add your control notification handler code here
BROWSEINFO bi = { 0 };
bi.lpszTitle = _T("Ñ¡ÔñĿ¼");
LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );

if ( pidl != 0 )
{
// get the name of the folder
TCHAR path[MAX_PATH];
if ( SHGetPathFromIDList ( pidl, path ) )
{
CString mypath=CString(path);
if (mypath.GetLength() > 3 )
{
mypath = mypath+ '//';
}
SearchFiles(mypath);
}

// free memory used
IMalloc * imalloc = 0;
if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
{
imalloc->Free ( pidl );
imalloc->Release ( );
}
}

}
 
感谢所有热心关注这个帖子的朋友,谢谢大家!尤其感谢xeen、bubble、OopsWare、Sachow(Sachow虽然
没进来,但通过发送信息和我做了交流)这四位朋友,因为他们对本问题做了具体的分析。

到目前为止,问题仍然没有解决。其实,判断一下szTypeName如果为空,就取文件名的扩展名,再加上
“文件”两个字,也将就了。但这显然不是根本的解决方法,纯属敷衍了事!不到万不得已,不予考虑!

昨天,我又将代码改了一下,尽量做到和Delphi不贴边,不用TSearchRec、FindFirst......而改用
WIN32_FIND_DATA、FindFirstFile、FindNextFile......也不用SelectDirectory(),而改用下面的代码
BROWSEINFOA bi;
char WDir[MAX_PATH];
LPITEMIDLIST ItemID;
memset(&bi, 0, sizeof(BROWSEINFOA));
memset(WDir, 0, MAX_PATH);
bi.hwndOwner = Handle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpszTitle = "请选择路径:";
ItemID = SHBrowseForFolder(&bi);
SHGetPathFromIDList(ItemID, WDir);
AnsiString aaa = String(WDir);
if( aaa.Length() != 3 )
aaa = aaa + "//";
SearchFiles(aaa);
和上面xeen给出的VC++代码差不多了,但还是不行,效果依旧!
但我并不认为是shell32.dll的毛病,更不认为是我的系统乱套了,需要重装了!!而倾向于在执行了
SelectDirectory()后,似乎程序做了某些初始化,或许是功力浅薄吧,看了SelectDirectory()的实现
代码,也没看出什么啊。

今天上午,我又在WinNT(NT4.0中文版+IE5+sp6)上做了测试,情况更糟糕!不论是那种方法都不能取
出不可识别文件的类型。

请大家继续开动脑筋或者问一下你们周围的高手,帮我分析一下到底是什么原因。

这个帖子一定要得到满意的答案才能结束!!凡是参与者,绝对有分!给出正确答复者高分!!

下面先请xeen、bubble、OopsWare、Sachow这四位朋友到这里
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1114322来领分。

别人还有什么好的思路,我再给!!!
 
首先:程序中if (sr.Attr<>faDirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
这句话有bug,提示一下sr.Attr<>faDirectory(?),具体改正,自己想把。

最后,我怀疑该问题和SHGetFileInfo调用有关,正在查msdn,建议你也查一下!
 
找到了,在msdn中有这么一句:
You must initialize COM with CoInitialize or OLEInitialize prior to
calling SHGetFileInfo
自己解决吧!
 
两个问题解决完,记得自己结束。

如果是我强制结束的话,我就拿不到风了:)
 
To zyy04,在MSDN哪里找到的。我加上了CoInitialize效果依旧,没有解决问题。
我看了不少 SHGetFileInfo 的例子也没初始化 com/ole对象啊?
 
to zyy04
为什么我把if (sr.Attr<>faDirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
这句注释掉以后,就可以全部显示出来了呢??
同样也没有初始化com环境阿。
 
一定是在SelectDirectory里面发生了什么!!!!!
因为你直接用SearchFiles('C:/')得到的结果也是错误的!肯定是某个Sh函数进行了初始化
而没有用SelectDirectory的时候,这个初始化就漏过了!
 
to bubble:
我在Win2K(Sp2)+D6(Sp2)上你说的情况没有发现,不知道你是在什么环境下测试的?
to xeen:
我得结果和你一样,看来下次发言前应该先测试一下:(
to HD_Copy:
经测试,在Button2Click的SearchFiles('d:/diablo II/save/');前加上
OpenDialog1.Execute;或是SaveDialog1.Execute;都可以取得正确的结果,而
加FontDialog1.Execute;确不行,所以范围可以缩小了!
 
這應該是個小Bug,
你把SHGetFileInfo的最後一個參數改成 SHGFI_TYPENAME or SHGFI_ATTRIBUTES
就完全正常了!
 
在SelectDirectory('请您选择分类库所对应的路径:', '', strDir);在调用到了
SHGetPathFromIDList [Now Supported on Windows NT]不被Windows NT支持。

[Now Supported on Windows NT]

Converts an item identifier list to a file system path.

WINSHELLAPI BOOL WINAPI SHGetPathFromIDList(

LPCITEMIDLIST pidl,
LPSTR pszPath
);


Parameters

pidl

Pointer to an item identifier list that specifies a file or directory
location relative to the root of the name space (the desktop).

pszPath

Pointer to a buffer that receives the file system path.
The size of this buffer is assumed to be MAX_PATH bytes.



Return Values

Returns TRUE if successful or FALSE if an error occurs ?for example,
if the location specified by the pidl parameter is not part of the file system.


 
各位大鱼小虾,不知哪位在win98下测试了,请通告一下测试结果,谢谢 !!!
 
虽然我帮不上什么忙,但是说句公道话,Delphi有时真是不好使,我随便编了一点程序,
小一点时,程序什么事也没有,可是代码一长一点,不是内存出错,就是这个毛病哪个毛病的
真是受不了了!!!谁可以帮我解释以下谢谢!!![:)]

 
我是过了。每问题
 
不好意思,“if (sr.Attr<>faDirectory)and(sr.Name<>'.')and(sr.Name<>'..') then”应该这样写:
(sr.Attr and faDirectory) = faDirectory

看来,和当初的预想是一样的!确实应该在调用SHGetFileInfo之前做一些初始化!
>>You must initialize COM with CoInitialize or OLEInitialize prior to calling SHGetFileInfo
这句话我也在MSDN上找到了,又在网上找了几篇相关的文章,可人家都和系统的Shell接口有关系,硬性
地套用也不对啊,总之,不是很明白其中的道理啊!

期盼着高手的到来!!!!!!!!!!!!!!!
 
老大,你的代码在我的电脑上运行没任何问题呀,根本就不会出现你所说的现象。
我这里连以“---”、“~db”以及各DELPHI的临时文件都可以正确显示。
我的运行环境:inter733 CPU + 256MB 内存,Windows98 [build 4.10.2222 A]+
Delphi Enterprise version 6.0 [build 6.240] Update Pack 2
 
不好意思,忘了说了。在我的电脑里运行时出现如下错误提示,但运行结果正常:
[Warning] Unit1.pas(7): Unit 'FileCtrl' is specific to a platform
 
后退
顶部