我有一些代码曾经在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)
}
答案 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布局 匹配,所以如果你确定这两个都是真的,那没关系 如果你在本地代码中使用的接口实际上是你的接口 定义自己。