Microsoft KB Archive/248194

= BUG: get_Version returns S_OK even if the version does not exist =

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.



Steps to reproduce the behavior
 Create a Win32 Console Application in Microsoft Visual C++.  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++


 * 1) include 
 * 2) include 
 * 3) include 
 * 4) 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; }  Download and add the ssauto.h header file that is used to integrate with Visual SourceSafe from the following Microsoft Web site:

http://www.msdn.microsoft.com/vstudio/previous/ssafe/downloads/samples/

 Run the program.</li></ol>

<div class="references_section">