BUG: get_Version returns S_OK even if the version does not exist (248194)



The information in this article applies to:

  • Microsoft Visual SourceSafe for Windows 5.0
  • Microsoft Visual SourceSafe for Windows 6.0

This article was previously published under Q248194

SYMPTOMS

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.

RESOLUTION

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
vssi->get_VersionNumber(&originalnumber);

// 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
vx->get_VersionNumber(&num);

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

// Release the item
vx->Release();

STATUS

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

MORE INFORMATION

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"");
    
       CoInitialize(0);
       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.");
    
                         vx->Release();
                      }
    
                      vssi->Release();
                   }
    
                   SysFreeString(bstrName);
                }
    
                pVdb->Release();
             }
    
             pClf->Release();
          }
       }
    
       CoUninitialize();
    
       SysFreeString(bstrPath);
       SysFreeString(bstrUName);
       SysFreeString(bstrUPass);
       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.

REFERENCES

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


Modification Type:MajorLast Reviewed:7/20/2005
Keywords:kbAutomation kbBug kbnofix KB248194 kbAudDeveloper