Registrations are now open. Join us today!
There is still a lot of work to do on the wiki yet! More information about editing can be found here.
Already have an account?

Microsoft KB Archive/248194

From BetaArchive Wiki

Article ID: 248194

Article Last Modified on 7/20/2005


  • Microsoft Visual SourceSafe 5.0 Standard Edition
  • Microsoft Visual SourceSafe 6.0 Standard Edition

This article was previously published under Q248194


When trying to get a specific version of a file or project, the get_Version function returns successfully and has a valid item even if that item does not exist in the database.


Instead of checking the HRESULT or whether the IVSSItem is not null, check the get_VersionNumber after calling get_Version. Compare the version numbers to make sure the version is valid. For example, place the following code inside the pVdb->get_VSSItem if statement:

// Used to store the latest version number of the item
long originalnumber, num;

// Store the latest version number of the item

// Get the version at the label (this label will fail)
CComVariant varLabel = -51;
vssi->get_Version(varLabel, &vx);

// Get the version number of the returned item

// Compare the versions and see if the item is valid
if ( num > 0 && num <= originalnumber )
   printf("Valid label.");

// Release the item


Microsoft has confirmed that this is a bug in the Microsoft products that are listed in the "Applies to" section.


Steps to reproduce the behavior

  1. Create a Win32 Console Application in Microsoft Visual C++.
  2. Add the following code to the project.

    Note This is the same code as in the following Microsoft Knowledge Base Article:

    169927 How to get history using SourceSafe OLE automation in C++

    #include <atlbase.h>
    #include <comdef.h>
    #include <initguid.h>
    #include "ssauto.h"
    int main ()
       CLSID clsid;
       IClassFactory *pClf;
       IVSSDatabase *pVdb;
       BSTR bstrPath = SysAllocString(L"c:\\Program Files\\Microsoft Visual Studio\\Common\\VSS\\srcsafe.ini");
       BSTR bstrUName = SysAllocString(L"guest");
       BSTR bstrUPass = SysAllocString(L"");
       if(S_OK == CLSIDFromProgID(L"SourceSafe", &clsid ))
          if(S_OK == CoGetClassObject( clsid, CLSCTX_ALL, NULL,
             IID_IClassFactory, (void**)&pClf ))
             if(S_OK == pClf->CreateInstance( NULL, IID_IVSSDatabase,
                (void **) &pVdb ))
                if(S_OK == pVdb->Open(bstrPath, bstrUName, bstrUPass))
                   // Get the root project
                   BSTR bstrName = SysAllocString(L"$/");
                   IVSSItem *vx;
                   IVSSItem *vssi;
                   if( S_OK == pVdb->get_VSSItem(bstrName, FALSE, &vssi) )
                      // Get the version at the label (this label should fail)
                      CComVariant varLabel = -51;
                      if( S_OK == vssi->get_Version(varLabel, &vx) )
                         // This prints out even though the label in invalid
                         printf("Should not be here.");
       return 0;
  3. Download and add the ssauto.h header file that is used to integrate with Visual SourceSafe from the following Microsoft Web site:
  4. Run the program.


For additional information, click the following article number to view the article in the Microsoft Knowledge Base:

196197 You receive an error message when you get a file from a project label by using OLE automation

Additional query words: ssauto

Keywords: kbbug kbnofix kbautomation KB248194