CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  工具平台和程序库

紧急求助~~~~在线等待,分不是问题,要多少给多少,请各位高手帮忙~~~~

楼主cuistar(DancingCode)2003-09-03 21:48:21 在 C/C++ / 工具平台和程序库 提问

给定一个目录,列出其中的所有文件(包括子目录下的文件),要求用对话框实现,要VC源程序全部代码(包括对话框函数对类函数的调用)。 问题点数:100、回复次数:5Top

1 楼ljan(冰魂)回复于 2003-09-03 22:18:34 得分 100

//   File.cpp   :   Defines   the   entry   point   for   the   console   application.  
  //  
   
  #include   "stdafx.h"  
  #include   "Shlobj.h"  
  //#include   <comdef.h>  
  #include   <tchar.h>  
  #include   "stdio.h"  
  #include   "conio.h"  
  //  
  //   This   method   converts   a   STRRET   structure   to   a   LPTSTR  
  //  
  IMalloc*   pMalloc;  
   
  LONG   StrRetToStr(STRRET   StrRet,   LPTSTR*   str,   LPITEMIDLIST   pidl)  
  {  
  HRESULT   hr   =   S_OK;  
  int   cch;  
  LPSTR   strOffset;  
   
  *str   =   NULL;     //   Assume   failure  
   
  switch   (StrRet.uType)  
  {  
  case   STRRET_WSTR:    
  cch   =   WideCharToMultiByte(CP_OEMCP,   0,   StrRet.pOleStr,   -1,   NULL,   0,   NULL,   NULL);    
  *str   =   (LPTSTR)pMalloc->Alloc(cch   *   sizeof(TCHAR));    
   
  if   (*str   !=   NULL)  
  WideCharToMultiByte(CP_OEMCP,   0,   StrRet.pOleStr,   -1,   *str,   cch,   NULL,   NULL);    
  else  
  hr   =   E_FAIL;  
  break;  
   
  case   STRRET_OFFSET:    
  strOffset   =   (((char   *)   pidl)   +   StrRet.uOffset);  
   
  cch   =   strlen(strOffset)   +   1;   //   NULL   terminator  
  *str   =   (LPTSTR)pMalloc->Alloc(cch   *   sizeof(TCHAR));  
   
  if   (*str   !=   NULL)  
  strcpy(*str,   strOffset);  
  else  
  hr   =   E_FAIL;  
  break;  
   
  case   STRRET_CSTR:    
  cch   =   strlen(StrRet.cStr)   +   1;   //   NULL   terminator  
  *str   =   (LPTSTR)pMalloc->Alloc(cch   *   sizeof(TCHAR));  
   
  if   (*str   !=   NULL)  
  strcpy(*str,   StrRet.cStr);  
  else  
  hr   =   E_FAIL;  
   
  break;  
  }    
   
  return   hr;  
  }  
   
  void   PrintFile(IShellFolder*   pFolder,   IMalloc*   pMalloc)  
  {  
        IEnumIDList*   pItems   =   NULL;  
        LPITEMIDLIST   pidlNext   =   NULL;  
        STRRET   StrRetName;  
        LPTSTR   lpszName   =   NULL;  
   
        //   Enumerate   all   object   in   the   given   folder  
        HRESULT   hr   =   pFolder->EnumObjects(NULL,   SHCONTF_FOLDERS|SHCONTF_NONFOLDERS,   &pItems);  
        while(hr   ==   NOERROR)  
        {  
              hr   =   pItems->Next(1,   &pidlNext,   NULL);  
      if(NOERROR   ==   hr)  
      {  
                    pFolder->GetDisplayNameOf(pidlNext,   SHGDN_NORMAL,   &StrRetName);  
                    StrRetToStr(StrRetName,   &lpszName,   pidlNext);  
   
    printf("%s   ",   lpszName);  
   
                    if(lpszName)  
                          pMalloc->Free(lpszName);  
      }            
        }  
   
        if(pItems)  
              pItems->Release();  
  }  
   
  int   main(int   argc,   char*   argv[])  
  {  
  wchar_t   path[MAX_PATH];  
   
  printf("请输入文件夹绝对路径:\n");  
  wscanf(L"%ls",   path);  
   
  // wprintf(L"%s",   path);  
  CoInitialize(NULL);  
   
          //   Get   a   pointer   to   the   IMalloc   interface  
  HRESULT   hr   =   SHGetMalloc(&pMalloc);  
  if(FAILED(hr))  
  return   hr;  
   
  IShellFolder*   pDesktop;  
  hr   =   SHGetDesktopFolder(&pDesktop);  
  if(FAILED(hr))  
  return   hr;  
   
  ULONG   chEaten;  
  ULONG   dwAttributes;  
          LPITEMIDLIST   pidlFolder   =   NULL;  
  LPOLESTR   strPath   =   path;  
  hr   =   pDesktop->ParseDisplayName(NULL,   NULL,   strPath,   &chEaten,  
  &pidlFolder,   &dwAttributes);  
  if(FAILED(hr))  
  return   hr;  
   
  IShellFolder*   pFolder;  
  hr   =   pDesktop->BindToObject(pidlFolder,   NULL,   IID_IShellFolder,   (void**)&pFolder);  
  pDesktop->Release();  
  if(FAILED(hr))  
  return   hr;  
   
  //   Print   subfolder   and   file  
  PrintFile(pFolder,   pMalloc);  
   
  CoUninitialize();  
   
  getch();  
  return   0;  
  }  
   
  正好是我以前的一个小例子...Top

2 楼ljan(冰魂)回复于 2003-09-03 22:20:02 得分 0

或者你可以用CFileFind来写Top

3 楼ezhou(煮花生)回复于 2003-09-03 23:21:04 得分 0

mark.Top

4 楼cuistar(DancingCode)回复于 2003-09-04 07:58:04 得分 0

谢谢高手,再问一下,有没有用CFileFind来写的程序啊????Top

5 楼ljan(冰魂)回复于 2003-09-04 09:00:49 得分 0

CFileFind没有,不过很简单,操作成员函数就可以了Top

相关问题

  • 情况紧急、高分相送、各位帮忙,在线等待,谢谢了!
  • 紧急,在线等待
  • 各位:在线等待!
  • dll问题,十万火急,请各位兄台紧急援助!在线等待中………………
  • 谁有redhat linux8的安装手册电子文档?紧急!求求各位,在线等待!!!
  • 紧急求助于, 在线等待, NNNNNNNNNNNNNNNNNNNNNNNNNN
  • 紧急求助(在线等待)!
  • 紧急求助!(在 线等待)
  • 紧急求救!!!(在线等待~~)
  • 紧急求助,在线等待!!!!!!!

关键词

  • hr
  • 函数
  • null
  • strret
  • pfolder
  • pmalloc
  • pdesktop
  • cch
  • pidlnext
  • stroffset

得分解答快速导航

  • 帖主:cuistar
  • ljan

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo