Wouldn't you know it... as soon as I posted my message, a light bulb
went off in my head. The problem is the cast between EnvDTE::Project
* and VCProjectEngineLibrary::VCProject *. The correct way to do it is:
hr = prj->get_Object(&disp);
vcp = (VCProjectEngineLibrary::VCProject *) disp;
green
--- In vsnetaddin@yahoogroups.com, "greeneyes_2399"
<greeneyes_2399@...> wrote:
>
> The return value from VCProject::get_Platforms is incorrect in my C++
> VS 2005 addin. Can someone tell me what I'm doing wrong?
>
> /////////////////////////////////////////////////////////////////
> EnvDTE::_Solution *sln;
> EnvDTE::Projects *prjs;
> EnvDTE::Project *prj;
> VCProjectEngineLibrary::VCProject *vcp;
> hr = m_pDTE->get_Solution(&sln);
> if ( SUCCEEDED(hr) )
> {
> hr = sln->get_Projects(&prjs);
> if ( SUCCEEDED(hr) )
> {
> hr = prjs->Item(CComVariant(1), &prj);
> IDispatch *disp;
> if ( SUCCEEDED(hr) )
> {
> vcp = VCProjectEngineLibrary::VCProject *)prj;
> hr = vcp->get_Platforms(&disp);
> VCProjectEngineLibrary::IVCCollection *plats
> =(VCProjectEngineLibrary::IVCCollection *)disp;
>
> //////////////////////////////////////////////////////////////////////
>
> If, in the debugger, I expand the value returned in disp, the vtable
> clearly is wrong. In fact the memory pointed to by disp contains a
> Unicode string containing the current project name, e.g.
myproject.vcproj.
>
> Thanks
> green
>