【问题标题】:Code crash with VS11 BetaVS11 Beta 导致代码崩溃
【发布时间】:2012-03-27 07:33:21
【问题描述】:

我有一些代码在以前版本的 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)
}

【问题讨论】:

  • 首先添加错误检查代码。不验证任何函数值只是在寻找您无法诊断的问题。使用 connect.microsoft.com 报告测试版错误。
  • “它崩溃了”是什么意思?它是如何崩溃的?崩溃时堆栈上有什么?是否抛出异常?抛出什么异常?如果单步执行代码,崩溃前的所有语句是否都正确执行?

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


【解决方案1】:

来自 MSDN 论坛

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    相关资源
    最近更新 更多