2

我有一些代码在以前版本的 Visual Studio 中可以工作,但在新的 beta 版本中崩溃了,我似乎不知道为什么。

我正在尝试获取 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)
}
4

1 回答 1

1

这是来自 MSDN 论坛

好的,来自 C++ 团队的消息是他们不支持 VS 版本之间的对象接口的反向兼容,这就是他们重新 GUID 的原因(您已经在上面说明了这一点)。

这意味着他们可能在 Dev11 中更改了 VCProject 的 v-table 布局,它不再与以前版本中的布局匹配。

也许您的代码以前可以工作,因为 GUID 发生了变化,但您正在使用的特定对象的 v-table 布局没有。

我不知道你是否出于某种原因需要导入 TLB,但理论上你可以特例 Dev11 并定义一个本地接口定义,它具有与 Dev11 VCProject 类相同的 v-table 布局和相同的 GUID,然后当您发现您的代码在 Dev11 中运行,您将使用该接口,否则您将使用“旧”接口。QI 在 GUID id 上工作,并且仅依赖于 v-table 布局匹配,因此如果您确保这两者都是正确的,那么您在本地代码中使用的接口是否实际上是您自己定义的接口并不重要。

于 2012-04-13T05:53:34.393 回答