How to get history using SourceSafe OLE Automation in C++

This article was previously published under Q169927
This article has been archived. It is offered "as is" and will no longer be updated.
The sample code in this article, along with the description of thestructures and functions used, provides a guide to retrieving a collectionof SourceSafe items and getting the history for these items. The samplecode is written in C++.
The SourceSafe Object Model contains 7 objects. The top-most of theseobjects is the VSSDatabase object. The first step in any SourceSafe OLEAutomation client is to make a connection to a VSSDatabase pointer throughthe IClassFactory interface. This article assumes that there is already apointer to the VSSDatabase object. For more information about getting aVSSDatabase pointer, please see the following Knowledge Base article:
169928 How To Open a SourceSafe Database with OLE Automation in C++
There are several operations available from the VSSItem object that producecollections. The Items property returns a collection of all childrenassociated with a VSSItem, this is useful for listing all the children of aSourceSafe Project. The Checkouts property returns a collection of allcheckouts on a file in Sourcesafe.

The method discussed in this article is the Versions method, which returnsa collection of Version objects. These represent old versions, labels andother actions that have been applied to the file or project in SourceSafeduring its lifetime.

Once you have a pointer to a valid IVSSItem, call the get_Versions method.get_Versions requires a long integer containing a number representing flagvalues, and a pointer to a pointer to an IVSSVersions object.

Call the _NewEnum method from pointer to IVSSVersions passing a pointer toan LPUNKNOWN. Then QueryInterface on the LPUNKNOWN for an IEnumVARIANTinterface. The IEnumVARIANT Interface supports Next, Skip, and Resetmethods. Using the Next Method within a while loop allows you to retrieveeach version within the collection using the punkVal property to get apointer to IUnknown.

Sample code

   #include <windows.h>   #include <ocidl.h>   #include <stdio.h>   #include "ssauto.h"   void ListVersions( IVSSDatabase* db, LPCSTR path )   {     BSTR bstrval;     char lpbuf[200];     char lpbuf2[200];     IVSSItem     *vssi;     IVSSVersion  *vers;     IVSSVersions *vx;     LPUNKNOWN    lpunk;     IEnumVARIANT *ppvobj;     VARIANT      st;     OLECHAR*     svalue;     BSTR         bstrValue;     int          x;     ULONG        fetched;     long         lvnum;     if( (x = MultiByteToWideChar(CP_ACP, 0, path, -1, svalue, 0 )) != 1)     {       svalue = new OLECHAR[x];       if( MultiByteToWideChar(CP_ACP, 0, path, -1, svalue, x ) == 0 )         MessageBox(NULL, "Error in Conversion", "Multibytetowide", MB_OK);     }     else       svalue = L"";     bstrValue = SysAllocString(svalue);     if( S_OK == db->get_VSSItem(bstrValue, FALSE, &vssi) )     {       if( S_OK == vssi->get_Versions( 0l, &vx ) )       {         if( S_OK == vx->_NewEnum(&lpunk) )         {           if(!FAILED(lpunk->             QueryInterface(IID_IEnumVARIANT, (void**)&ppvobj)))           {             vssi->get_Spec( &bstrval );             x = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)bstrval, -1,               lpbuf, sizeof(lpbuf), NULL, NULL );             printf("History of: %s\n", lpbuf );             printf("ACTION   USER NAME   VERSION NUMBER\n");             do             {               ppvobj->Next( 1UL, &st, &fetched );               if( fetched != 0 )               {                 if(!FAILED(st.punkVal->                   QueryInterface(IID_IVSSVersion,(void**)&vers)))                 {                   vers->get_Action( &bstrval );                   WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)bstrval, -1,                     lpbuf, sizeof(lpbuf), NULL, NULL );                   vers->get_Username( &bstrval );                   WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)bstrval, -1,                     lpbuf2, sizeof( lpbuf2 ), NULL, NULL );                   vers->get_VersionNumber( &lvnum );                   printf("%s  %s  %ld\n", lpbuf, lpbuf2, lvnum );                   vers->Release();                 }                 st.punkVal->Release();               }             } while( fetched != 0 );             ppvobj->Release();           }           lpunk->Release();         }         vx->Release();       }       vssi->Release();     }     SysFreeString(bstrValue);   }				
MSDN Library: IClassFactory; IEnumVARIANT Interface; Visual SourceSafe OLEAutomation

You can download the header file ssauto.h from the following Web site:

Article ID: 169927 - Last Review: 02/24/2014 08:29:04 - Revision: 2.0

  • Microsoft Visual SourceSafe 5.0 Standard Edition
  • Microsoft Visual SourceSafe 6.0 Standard Edition
  • kbnosurvey kbarchive kbhowto KB169927