Сбой кода с VS11 Beta

У меня есть код, который работал в предыдущих версиях Visual Studio, но дает сбой в новой бета-версии, и я не могу понять, почему.

Я пытаюсь получить объект VCReferences для проекта VCProject. Код, который должен работать на всех версиях 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)
}

person Ciprian    schedule 27.03.2012    source источник
comment
Начните с добавления кода проверки ошибок. Отсутствие проверки каких-либо значений функций просто вызывает проблемы, которые вы не можете диагностировать. Используйте connect.microsoft.com, чтобы сообщать об ошибках бета-тестирования.   -  person Hans Passant    schedule 28.03.2012
comment
Что значит вылетать? Как это вылетает? Что в стеке при сбое? Выдается исключение? Какое исключение выброшено? Если вы пошагово выполняете код, все ли операторы до сбоя выполняются без ошибок?   -  person James McNellis    schedule 13.04.2012


Ответы (1)


Это с форумов MSDN

Хорошо, команда C ++ сообщила, что они не поддерживают обратную совместимость своих объектных интерфейсов между версиями VS, поэтому они повторно меняют GUID (что вы уже указали выше).

Это означает, что они, вероятно, изменили макет v-table VCProject в Dev11, и он больше не соответствует макету в предыдущих версиях.

Возможно, ваш код работал раньше, потому что идентификаторы GUID изменились, но макеты v-table конкретных объектов, которые вы используете, не изменились.

Я не знаю, НЕОБХОДИМО ли вам импортировать TLB по какой-либо причине, но теоретически вы могли бы в особом случае Dev11 определить определение локального интерфейса с тем же макетом v-table, что и класс VCProject Dev11, и тем же GUID, а затем, когда вы обнаружите, что ваш код работает в Dev11, вы бы использовали этот интерфейс, иначе вы бы использовали «старый». QI работает с идентификаторами GUID и полагается только на сопоставление макета v-таблицы, поэтому, если вы убедитесь, что оба из них верны, не имеет значения, действительно ли интерфейс, который вы используете в своем локальном коде, тот, который вы определили сами.

person Ciprian    schedule 13.04.2012