2012-03-27 73 views
2

我有一些代码,以前的版本的Visual Studio中工作,但崩溃在新的测试版,我似乎无法弄清楚为什么。代码崩溃与VS11测试版

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

首先添加错误检查代码。不验证任何函数值只是要求您无法诊断的麻烦。使用connect.microsoft.com报告测试版错误。 – 2012-03-28 12:41:34

+0

“它崩溃”是什么意思?它如何崩溃?崩溃时栈上有什么?抛出异常吗?抛出什么异常?如果单步执行代码,那么执行崩溃之前的所有语句都没有错误? – 2012-04-12 22:24:32

回答

1

这是从MSDN论坛

好,字从C++团队是他们不支持后台COMPAT的VS版本之间 它们的对象的接口,这就是为什么他们重​​新GUID 他们(你已经在上面说明了)。

这意味着他们可能已经更改了 Dev11中VCProject的v-table布局,并且它不再与先前版本中的布局相匹配。

也许您的代码之前工作过,因为GUID已更改,但您使用的特定对象的v-table布局没有。

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