代码崩溃与VS11 Beta

时间:2012-03-27 07:33:21

标签: visual-studio beta visual-studio-2012 envdte

我有一些代码曾经在Visual Studio的早期版本中工作但在新的测试版中崩溃,我似乎无法弄清楚原因。

我正在尝试获取VCProject的VCReferences对象。它应该适用于所有版本的VS的代码。

感谢。

VCProject * GetVCProjectObject(IDispatch * aDispatch)
{  
  IID VCProject_IID;
  switch(mStudioVersion)
  {
    case VS2003:
      ::IIDFromString(_bstr_t(L"{70b6c8e7-5b3e-49c7-9937-c5f0b3168af3}"), &VCProject_IID);
      break;
    case VS2005:
      ::IIDFromString(_bstr_t(L"{238b5174-2429-11d7-8bf6-00b0d03daa06}"), &VCProject_IID);
      break;
    case VS2008:
      ::IIDFromString(_bstr_t(L"{3990034a-3af2-44c9-bd22-7b10654b5721}"), &VCProject_IID);
      break;
    case VS2010:
      ::IIDFromString(_bstr_t(L"{885c172e-5b7a-43b9-8ad0-697f48233772}"), &VCProject_IID);
      break;
    case VS11:
      ::IIDFromString(_bstr_t(L"{F900F95E-1D99-4631-BBD1-E3E1E078D58E}"), &VCProject_IID);
      break;
}

  CComPtr<VCProject> vcProject;
  aDispatch->QueryInterface(VCProject_IID, (void**)&vcProject);

  return vcProject.Detach();
}


void SomeMethod(EnvDTE::Project * aProject)
{
  CComPtr<IDispatch> pID;
  aProject->get_Object(&pID);
  CComPtr<VCProject> vcProject = GetVCProjectObject(pID);

  if (!vcProject)
    return false;

  CComPtr<IDispatch> dipsProjRefs; 
  //CRASH HERE !!!! 
  vcProject->get_VCReferences(&dipsProjRefs)
}

1 个答案:

答案 0 :(得分:1)

这是来自MSDN论坛

  

好的,来自C ++团队的消息是他们不支持back-compat   他们在VS版本之间的对象接口,这就是他们重新GUID的原因   他们(你已经在上面说过)。

     

这意味着他们可能已经改变了VCProject的v-table布局   Dev11和它不再匹配以前版本的布局。

     

也许您的代码之前有效,因为GUID已更改,但是   您正在使用的特定对象的v表格布局没有。

     

我不知道你是否因某种原因需要导入TLB,但是   理论上你可以特殊情况下Dev11并定义一个本地接口   使用与Dev11 VCProject类相同的v-table布局定义   和相同的GUID,然后当你发现你的代码正在运行时   Dev11你会使用那个界面,否则你会使用'旧'   一。 QI适用于GUID ID,仅依赖于v-table布局   匹配,所以如果你确定这两个都是真的,那没关系   如果你在本地代码中使用的接口实际上是你的接口   定义自己。