2

以前のバージョンの 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)
}
4

1 に答える 1

1

これはMSDNフォーラムからのものです

さて、C ++チームからの言葉は、VSバージョン間のオブジェクトインターフェイスの下位互換性をサポートしていないということです。そのため、C ++チームはそれらを再GUIDします(これはすでに上記で説明しています)。

つまり、Dev11のVCProjectのv-tableレイアウトが変更された可能性があり、以前のバージョンのレイアウトとは一致しなくなりました。

GUIDが変更されたためにコードが機能した可能性がありますが、使用している特定のオブジェクトのvテーブルレイアウトは機能しませんでした。

何らかの理由でTLBをインポートする必要があるかどうかはわかりませんが、理論的には、Dev11を特殊なケースにして、Dev11VCProjectクラスと同じv-tableレイアウトと同じGUIDを使用してローカルインターフェイス定義を定義できます。コードがDev11で実行されている場合は、そのインターフェイスを使用します。それ以外の場合は、「古い」インターフェイスを使用します。QIはGUIDIDで機能し、v-tableレイアウトの一致のみに依存するため、両方が真であることを確認すれば、ローカルコードで使用するインターフェイスが実際に自分で定義したものであるかどうかは関係ありません。

于 2012-04-13T05:53:34.393 に答える