写了一个命名空间扩展来虚拟磁盘,用的是default view,在xp上运行正常,但是到win7(32,64bits)上,创建view的API总是返回0x80070002,ERROR_FILE_NOT_FOUND。API原型为:HRESULT SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv);这个API既没有让传入文件路径和注册表路径等参数,失败提示却是ERROR_FILE_NOT_FOUND,网上搜了几天还是解决不了,MS真是太邪恶了,要是能看这个API的实现没准几分钟就明白什么回事。望达人赐教!

解决方案 »

  1.   

    大侠......我有个问题想请教你......能留下你的QQ吗?关于Shell扩展的
      

  2.   

    谢谢老大。用procmon后发现几十个注册表项找不到,而MSDN也找不到编写win7 shell extension应该填多写那些表项,即xp下不需要而win7需要的注册表项。在win7 32位上装nero 7,装的时候提示兼容性问题,但忽略还是能安装完,扩展节点也在“我的电脑”下显示,用IDA Pro看nero 7的扩展也是调用了SHCreateShellFolderView这个API,同样在win7 32位无法打开Default窗口,症状和我自己写的扩展一样。在win7 64位上装nero 10试用版,安装完成后发现nero 10并不是shell扩展程序,而是平时使用的桌面程序。怀疑是不是win7上这个API不成功所以nero不再做成扩展形式,但是MSDN中关于这个API的说明是shell32.dll 5.0以上版本、win 2000以上都支持,再也不知道哪儿去找资料了......
      

  3.   

    安装了gmail driver和Nokia的扩展,发现他们都是自己实现的view,而不是调用API产生default view,我们当初是为了保持和系统一致才不定制view。
      

  4.   

    用IExplorerBrowser集成defview看看?
      

  5.   

    集成这个没做过,可能会比较费劲吧。win 2k 关于这个的源码:STDAPI SHCreateShellFolderViewA(const SFV_CREATE* pcsfv, IShellView ** ppsv)
    {
        if (!pcsfv || SIZEOF(*pcsfv)!=pcsfv->cbSize)
        {
            return E_INVALIDARG;
        }    CDefView *pdsv = new CDefView(pcsfv->_pshf, pcsfv->psfvcb, pcsfv->psvOuter);
        if (pdsv)
        {
            *ppsv = pdsv;
            return NOERROR;
        }
        return E_OUTOFMEMORY;  // error
    }只要参数正确,new一个类返回几乎不会失败,而且也没有ERROR_FILE_NOT_FOUND这样的返回值,不知道到了win7这个实现变成怎么样。我的感觉是缺少系统文件或者某项注册表项缺失,或者还有可能跟windows正版验证有关系?
      

  6.   

    通过IDA Pro查看汇编代码解决了.Win7在这个API里边调用了新增的两个API(只有Win7支持),那两个API对从IShellFolder派生的类的实现有不同的要求。