我们做了一个应用程序,后缀名为.Reft,是个MDI程序。现在我们想双击该特定的后缀名就打开我们的应用程序,因此把这个功能提出来,做成(consol下)EXE,运行该程序就进行注册该后缀名。
可是结果为什么不对,图标没有改并且双击也不能用我们指定的应用程序打开!发现注册表也是正确的:如:
HKEY_CLASSES_ROOT\.Reft       //Reft为文件扩展名,并把它的缺省值设为Reft.Doc   
HKEY_CLASSES_ROOT\Reft.Doc\shell\open\command   //Reft.Doc为上一个键值,并把它的缺省值设为 "(绝对路径)Reft.exe   %1"   
HKEY_CLASSES_ROOT\Reft.Doc\DefaultIcon           //该键用来设置该类文件的显示图标(该Reft.exe的图标)可是真的很奇怪,不知道为什么双击总是不能打开?(计算机也重启了!)哪位高手指点下????是不是还有其他的地方要更改!
非常感谢!

解决方案 »

  1.   

    键值具体是怎么设置的?检查一下路径是否正确。
    另外,可以在InitInstance函数中显示一个MessageBox来确定程序是否被加载。
      

  2.   

    以前用到时写的, 把当前目录下的对应程序注册为打开程序, 你可以更改.////////////////////register////////////////////////////
    HKEY key; 
    HKEY key1,key2,key3,key4,key5;
    DWORD d=sizeof(char);
     
       
        char sName[128]="\"";

        
    strcat(sName,"e:\\text\\Myor.exe"); //打开的程序 strcat(sName,"\"");
    strcat(sName," \"");
    strcat(sName,"%1");
    strcat(sName,"\" ");
    strcat(sName,"%*");
    //char *p=strrchr(sName,'"');
        //strcpy(p,"\"");
    char demo[20]="C3DFile"; //文件描述, 后缀名为.c3d

       if(RegOpenKeyEx(HKEY_CLASSES_ROOT,".c3d",0,KEY_READ,&key))//如果.c3d键没有创建,以下就创建  
       {   
      
          if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_CLASSES_ROOT,"",0,KEY_READ,&key1))//打开HKEY_CLASSES_ROOT
      {
         if (ERROR_SUCCESS==RegCreateKeyEx(key1,".c3d",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key2,&d))
     {
    RegSetValueEx(key2,NULL,NULL,REG_SZ,(LPBYTE)demo,20); if (ERROR_SUCCESS==RegCreateKeyEx(key2,"DefaultIcon",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key3,&d))
    {
    RegCloseKey(key3);
    }
    if (ERROR_SUCCESS==RegCreateKeyEx(key2,"shell",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key3,&d))
    {
    if (ERROR_SUCCESS==RegCreateKeyEx(key3,"open",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key4,&d))
    {
    if (ERROR_SUCCESS==RegCreateKeyEx(key4,"command",0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&key5,&d))
    { RegSetValueEx(key5,NULL,NULL,REG_SZ,(LPBYTE)sName,MAX_PATH);
    RegCloseKey(key5);
    }
                         RegCloseKey(key4);
    }
    RegCloseKey(key3);
    }

    RegCloseKey(key2);
    }

    RegCloseKey(key1);
    }
    //     RegCloseKey(key);
       }
      

  3.   

    shell\open\command 一般是程序路径和%1,最好使用双引号引用起来:"程序路径名" "%1"
      

  4.   

    奇怪,我改为用Windows自带的记事本就可以打开,为什么我用自己的程序就不能打开呢?路径都是对的!
    ????????
      

  5.   

    可以使用 GetCommandLine 获取命令行,然后使用 PathGetArgs 取出命令行中的参数,最后使用 PathUnquoteSpaces 去掉参数的双引号。PathGetArgs 和 PathUnquoteSpaces 函数需要包含头文件 shlwapi.h 和导入库 shlwapi.lib 。 
      

  6.   

    先看你的程序是否执行,然后ParseCommandLine等查看一下命令行参数是否接收
      

  7.   

    试了下!可以了,自己的工程文件可以用我们的程序打开了。
    但是有一个地方很奇怪:
    我注册了好几种后缀名:.Reft,.cpp,.c,cxx,.h,.hpp; 还有就是我的电脑装有VS6.0 和 VS2008, 运行该程序注册后缀名后,其他几种后缀名的文件都可以以我们的应用程序打开。
    可是.h 和 .cpp的后缀名的文件始终是以VS2008打开,并不按照我们的应用程序执行,我看了注册表发现也是更改了。
    (注:原来VS2008注册的.h和.cpp被更改成以我们的程序打开)
    什么回事????
      

  8.   

    应该还有一个地方没有改,你可以这样,先备份注册表,然后右键点击一个.cpp文件,选择 "打开方式" 再选择 "选择程序",就会打开一个 "打开方式" 窗口,在这个窗口里选择你的程序(如果没有列表中显示就浏览出来) 再选中下方的 "始终以该程序打开这类文件"的选项,确定后就会完全生效. 以后双击.CPP文件就会用你的程序也不会用VS2008了,然后你再备份一备注册,二份注册对比一下,有一个软件Regmon专门进行注册表比较的,可以很快找开差异出来.