Microsoft KB Archive/248194

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Article ID: 248194

Article Last Modified on 7/20/2005



APPLIES TO

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



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



Additional query words: ssauto

Keywords: kbbug kbnofix kbautomation KB248194