如rar,zip,doc等???
谢谢!

解决方案 »

  1.   

    SHGetFileInfoDWORD_PTR SHGetFileInfo(
        LPCTSTR pszPath,
        DWORD dwFileAttributes,
        SHFILEINFO *psfi,
        UINT cbFileInfo,
        UINT uFlags
    );具体参考 MSDN, 可以取得图标的 hIcon 或者一个 ImageList 和图标 Index
      

  2.   

    In355Hz(好象一条狗) :
    你的方法好像必须要有文件存在,
    但我想只得到图标,而不必有相应的文件!!
    谢谢!
      

  3.   

    写了一个例子,用来得到VC的.dsw文件的图标,别的类似:HKEY hKey;
    RegOpenKeyEx(HKEY_CLASSES_ROOT,".dsw",0,KEY_QUERY_VALUE,&hKey);
    char szDocType[100];
    DWORD nSizeBuf=100,nRegType=REG_SZ;
    RegQueryValueEx(hKey,NULL,NULL,&nRegType,(LPBYTE)szDocType,&nSizeBuf);
    RegCloseKey(hKey);
    HKEY hDocType;
    RegOpenKeyEx(HKEY_CLASSES_ROOT,szDocType,0,KEY_QUERY_VALUE,&hDocType);
    HKEY hIcon;
    RegOpenKeyEx(hDocType,"DefaultIcon",0,KEY_QUERY_VALUE,&hIcon);
    char szIconPath[MAX_PATH];
    nSizeBuf=MAX_PATH;
    RegQueryValueEx(hIcon,NULL,NULL,&nRegType,(LPBYTE)szIconPath,&nSizeBuf);
    RegCloseKey(hDocType);
    RegCloseKey(hIcon);
    char* p=strrchr(szIconPath,',');
    int index=atoi(p+1);
    *p=0;
    HICON hIcon=ExtractIcon(AfxGetInstanceHandle(),szIconPath,index);
      

  4.   

    也可以用 SHGetFileInfo 参见 MSDN 注解:If the uFlags parameter includes the SHGFI_USEFILEATTRIBUTES flag, this parameter does not have to be a valid file name. The function will proceed as if the file exists with the specified name and with the file attributes passed in the dwFileAttributes parameter. This allows you to obtain information about a file type by passing just the extension for pszPath and passing FILE_ATTRIBUTE_NORMAL in dwFileAttributes.
      

  5.   

    SHFILEINFO sfi;
    SHGetFileInfo(TEXT("*.dsw"), FILE_ATTRIBUTE_NORMAL, 
        &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON))
      

  6.   

    1、 提取并显示出图标到左侧列表框中。代码实现如下://读取各种资源内部图标并显示在左侧列表框中 
    void CIconSnapDlg::OnOK() 

    CFileDialog fileDialog( TRUE,"*.ICO",NULL,NULL,"资源文件(*.ICO,*.BMP,*.EXE,*.DLL,*.ICL)|*.ICO;*.BMP;*.EXE;*.DLL;*.ICL||");
    if (fileDialog.DoModal() == IDOK) 

    szOpenFileName=fileDialog.GetPathName(); 
    szOpenFileExtName= fileDialog.GetFileExt ();
    szOpenFileExtName.MakeLower ();m_List.ResetContent (); //选清空左侧图标列表框//读取并显示ICON文件
    if(szOpenFileExtName =="ico") 
    {
    lpIR=pIcons->ReadIconFromICOFile (szOpenFileName); 
    HICON hIcon;
    hIcon=ExtractIcon(AfxGetInstanceHandle(),szOpenFileName,0);
    if(hIcon!=NULL)
    m_List.AddString (szOpenFileName);
    CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);
    pStatic->SetIcon (hIcon);
    }
    else if(szOpenFileExtName == "bmp") //读取并显示BMP文件
    {
    pIcons->IconImageFromBMPFile (szOpenFileName,&lpIR->IconImages[0],TRUE);
    HICON hIcon;
    hIcon=pIcons->MakeIconFromResource (&lpIR->IconImages [0]);
    if(hIcon!=NULL) 
    m_List.AddString (szOpenFileName);
    CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);
    pStatic->SetIcon (hIcon);
    }
    else //读取并显示EXE、DLL等资源文件
    {
    HINSTANCE hLibrary;// Load the DLL/EXE - NOTE: must be a 32bit EXE/DLL for this to work
    if( (hLibrary = LoadLibraryEx( szOpenFileName, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL )
    {
    // Failed to load - abort
    MessageBox( szOpenFileName+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK );
    return;
    }
    // Store the info
    EDII.szFileName =szOpenFileName;
    EDII.hInstance = hLibrary;// Fill in the listbox with the icons available
    if( ! EnumResourceNames( EDII.hInstance, RT_GROUP_ICON, (ENUMRESNAMEPROC )MyEnumProcedure, (LPARAM)GetSafeHwnd()) )
    {
    MessageBox( "列举图标资源名时出错!", "错误", MB_OK );
    return;
    }
    }m_List.SetCurSel (0);
    if( m_List.GetCount() == 0 )
    {
    MessageBox( "此文件中没有图标资源!", "错误", MB_OK );
    //无图标资源,置保存和复制按钮为无效状态
    m_Copy.EnableWindow (false);
    m_SaveAs.EnableWindow (false);
    return;
    }
    //有图标资源,置保存和复制按钮为有效状态
    m_Copy.EnableWindow (true);
    m_SaveAs.EnableWindow (true);//刷新调用OnPaint来显示图标
    InvalidateRect(NULL,TRUE);


    在OnPaint()涵数中加入下面代码用来具体显示提取出的图标或位图资源。
    //根据左侧图标列表,利用OnPaint()来更新右侧相应图标 LPTSTR lpIconID;
    HICON hIcon;
    if((lpIconID=(LPTSTR)m_List.GetItemData(m_List.GetCurSel()))!=(LPTSTR)LB_ERR )
    {
    if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl")
    {
    hIcon=pIcons->GetIconFromInstance(EDII.hInstance,lpIconID);
    CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS);
    pStatic->SetIcon (hIcon);
    }
    }
      

  7.   

    (1) SDK函数 SHGetFileInfo 或使用 ExtractIcon获得图标资源的 handle; 
    (2) SDK函数 SHGetFileInfo 获得有关文件的很多信息,如大小图标,属性, 类型等。 
    Example(1): 
    在程序窗口左上角显示 NotePad图标. 
    void CSampleView: 
    OnDraw(CDC * pDC) 

    if( :: SHGetFileInfo(_T("c:\\pwin95\\notepad.exe"),0, 
    &stFileInfo,sizeof(stFileInfo),SHGFI_ICON)) 

    pDC ->DrawIcon(10,10,stFileInfo.hIcon) 


    Example(2):同样功能,Use ExtractIcon Function 
    void CSampleView:: OnDraw(CDC *pDC) 

    HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T 
    ("NotePad.exe"),0) 
    if (hIcon &&hIcon!=(HICON)-1) 
    pDC->DrawIcon(10,10,hIcon) 

    说明: 获得notepad.exe的路径正规上来说用GetWindowsDirectory函数得到, 如果是调用 win95下的画笔,应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点. 
      

  8.   

    SHFILEINFO sfi;SHGetFileInfo("d:\\smartdrv.exe",0,&sfi,sizeof(sfi),SHGFI_ICON);
    HICON hIcon = sfi.hIcon;
    CClientDC Clientdc(this);
    Clientdc.DrawIcon(10,10,hIcon);
    Clientdc.DeleteDC;也可以使用ExtractIcon()函数,该函数原型为:HICON ExtractIcon(
      HINSTANCE hInst,          // 实例句柄
      LPCTSTR lpszExeFileName,  // 文件名
      UINT nIconIndex           // 图标索引
    );参数
    hInst 
    [in] 调用该函数的应用程序句柄. 
    lpszExeFileName 
    [in] 指向空字符串结尾的可执行文件,DLL,或图标文件名. 
    nIconIndex 
    [in] 指定基于0的图标索引.例如,如果值为0,函数返回指定文件开始图标的句柄. 
    如果值为-1,函数返回指定文件中图标的数量.如果文件是一个可执行文件或DLL,返回值是RT_GROUP_ICON资源号.
    如果文件是一个.ICO文件,返回值为1. 必须调用DestroyIcon来销毁由ExtractIcon返回的图标句柄CClientDC clientDc(this);HICON hIcon = ExtractIcon(AfxGetApp()->m_hInstance,"C:\\Program Files\\Outlook Express\\msimn.exe",1);
    clientDc.DrawIcon(10,10,hIcon);//返回图标数目
    HICON hIcon = ExtractIcon(AfxGetApp()->m_hInstance,"C:\\Program Files\\Outlook Express\\msimn.exe",-1);
    CString str;
    str.Format("%d",hIcon);
    AfxMessageBox(str);DestroyIcon(hIcon);
      

  9.   

    这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如C:\MyFile\SomeFile.zzp。那你可以调用ExtractAssociatedIcon函数获得于特定文件关联的图标。但这个函数只适用于磁盘上存在实际的文件(或某处可存取)。
        如果你想查找与一般文件类型关联的图标,那你就必须读注册表。例如,为了查找出.cpp文件使用的图标,你就要察看注册表的HKEY_CLASSES_ROOT\.cpp入口,在我的机器上,其第一行的值是“cppfile”,然后继续察看HKEY_CLASSES_ROOT\cppfile的DefaultIcon键值,在我的机器上是:HKEY_CLASSES_ROOT\cppfile\DefaultIcon =
    "C:\PROGRA~1\MICROS~4\Common\MSDev98\Bin\msdev.exe,-20209"    所以.cpp文件的图标在C:\PROGRA~1\MICROS~4\Common\MSDev98\Bin\msdev.exe文件中的图标资源ID号为20209。一般情况下,HKCR\.foo有一个类似foofile的入口值,并在HKCR \foofile\DefaultIcon中指定了cpp文件的图标。
        但是,有的时候.foo的入口值不是foofile,而是象“SuperApp.Document.5”,它的意思是SuperApp文档的第五个版本,在HKEY_CLASSES_ROOT\ SuperApp.Document.5中没有DefaultIcon键值,但有键值CLSID={又长又丑的十六进制GUID},这就告诉你.foo是COM对象,其类的ID值就是那又长又丑的十六进制GUID。要得到关联的图标,必须到\CLSID\{又长又丑的十六进制GUID}\ DefaultIcon查找。哭吧!太痛苦了。但是还没完呢!因为foofile还可能有一个定制的以外壳扩展形式实现的图标处理器。为此你还要检查一下,加载这个图标处理器,调用IShellIcon或者IExtractIcon 并且继续哭吧,这真是太荒唐啦!
        所幸的是,有一个更好的方法来避开令人厌恶的注册表,那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.txt。即便文件不存在,SHGetFileInfo也能获得你要的信息。SHFILEINFO shfi;
    memset(&shfi,0,sizeof(shfi));
    SHGetFileInfo("foo.bmp", 
    FILE_ATTRIBUTE_NORMAL,
    &shfi, sizeof(shfi),
    SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
      

  10.   

    我这里有个Demo
    要的话发消息给我你的email
    我发给你
      

  11.   

                           ---------------------------------
                                   May you succeed!