1. 
// 获得系统注册后缀对应图标列表
CImageList gSysImageList;
SHFILEINFO shFinfo;
HIMAGELIST hImgList = (HIMAGELIST)SHGetFileInfo( "C:\\",
                      0, &shFinfo, sizeof( shFinfo ),
                      SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
gSysImageList.Attach(hImgList);// 获得指定路径文件的对应图标在gSysImageList中的序号
SHGetFileInfo( strFileName, 0, &shFinfo, sizeof( shFinfo ),
               SHGFI_ICON | SHGFI_SMALLICON | SHGFI_TYPENAME );
// shFinfo.iIcon 是文件的后缀对应图标序号
// shFinfo.szTypeName 是文件的注册类型名2. 一个不太完美但还过得去的办法如下,象.txt,.doc文件都没问题。
ShellExecute( hWnd, "open", strName, NULL, m_strDir, SW_SHOW);比较好的解决方法是调用IContextMenu::InvokeCommand ,运用到COM接口,太复杂了,不是一张贴子可以说清的。

解决方案 »

  1.   

    谢谢softsprite,我的意思是自己的程序怎么实现1中的效果。
      

  2.   

    假设你的EXE文件为c:\abc.exe
    在你的应用程序中加入以下两个函数,stol为类型转换函数,reg为文件类型注册函数,执行它,然后重新启动,所有的.abc文件图标全部变为c:\abc.exe的图标,并且双击.abc默认使用abc.exe打开,但你还需要增加对命令行的参数的处理才能进行打开后的进一步操作.
    我在VC6+WIN98中使用通过无误,如有问题欢迎联系:[email protected] CLj1Dlg::reg(char p[])  //文件注册函数,p在这里为加点扩展名".abc"
    {
    //创建入口    HKEY hKEY; 
        LPBYTE set;    
        DWORD type_1;
        int cbData_1;    CString s=p,s1;    s.Delete(0);
        //在WINDOWS中注册.abc
        s+="file";
        ::RegCreateKey(HKEY_CLASSES_ROOT,p,&hKEY);//建立子键
        set=stol(s); //使用自定义函数将CString型转换为LPBYTE方可写入
        type_1=REG_SZ;//指定写入数据的类型为字符串
        cbData_1=s.GetLength();
        ::RegSetValueEx(hKEY,"", NULL,type_1,set,cbData_1);
         //将.abc的图标改为abc.exe的图标
        s1=s;
        s1+="\\DefaultIcon";
        set=stol("c:\\abc.exe");//设你的abc.exe在C盘根目录下
        ::RegCreateKey(HKEY_CLASSES_ROOT,s1,&hKEY); // 建立入口
        ::RegSetValueEx(hKEY,"",NULL,type_1,set,11);  //向入口写入数据
        //设置.abc的打开文件为c:\abc.exe
        s1=s;
        s1+="\\shell\\open\\command";
        set=stol("c:\\abc.exe %1");
        ::RegCreateKey(HKEY_CLASSES_ROOT,s1,&hKEY);
        ::RegSetValueEx(hKEY,"",NULL,type_1,set,11);}LPBYTE CLj1Dlg::stol(CString s)//类型转换函数
    {
        char ch1=0;
        int i;    LPBYTE lpb=new BYTE[s.GetLength()+1];
        for(i=0;i<s.GetLength();i++)
        {lpb[i]=s[i];}
    lpb[i]=ch1;
        return lpb;
    }
      

  3.   

    设你的应用程序为c:\abc.exe
    在你的应用程序中加入以下两个函数,stol为类型转换函数,reg为文件类型注册函数,执行它,然后重新启动,所有的.abc文件图标全部变为c:\abc.exe的图标,并且双击.abc默认使用abc.exe打开,但你还需要增加对命令行的参数的处理才能进行打开后的进一步操作.
    我在VC6+WIN98中使用通过无误,如有问题欢迎联系:[email protected] CLj1Dlg::reg(char p[])  //文件注册函数,p在这里为加点扩展名".abc"
    {
    //创建入口    HKEY hKEY; 
        LPBYTE set;    
        DWORD type_1;
        int cbData_1;    CString s=p,s1;    s.Delete(0);
        //在WINDOWS中注册.abc
        s+="file";
        ::RegCreateKey(HKEY_CLASSES_ROOT,p,&hKEY);//建立子键
        set=stol(s); //使用自定义函数将CString型转换为LPBYTE方可写入
        type_1=REG_SZ;//指定写入数据的类型为字符串
        cbData_1=s.GetLength();
        ::RegSetValueEx(hKEY,"", NULL,type_1,set,cbData_1);
         //将.abc的图标改为abc.exe的图标
        s1=s;
        s1+="\\DefaultIcon";
        set=stol("c:\\abc.exe");//设你的abc.exe在C盘根目录下
        ::RegCreateKey(HKEY_CLASSES_ROOT,s1,&hKEY); // 建立入口
        ::RegSetValueEx(hKEY,"",NULL,type_1,set,11);  //向入口写入数据
        //设置.abc的打开文件为c:\abc.exe
        s1=s;
        s1+="\\shell\\open\\command";
        set=stol("c:\\abc.exe %1");
        ::RegCreateKey(HKEY_CLASSES_ROOT,s1,&hKEY);
        ::RegSetValueEx(hKEY,"",NULL,type_1,set,11);}LPBYTE CLj1Dlg::stol(CString s)//类型转换函数
    {
        char ch1=0;
        int i;    LPBYTE lpb=new BYTE[s.GetLength()+1];
        for(i=0;i<s.GetLength();i++)
        {lpb[i]=s[i];}
    lpb[i]=ch1;
        return lpb;
    }
    顺便说一句,这个论坛实在是太慢了,我用了将近20分钟才把这个贴子发上去!