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
- 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++
#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; }
- Download and add the ssauto.h header file that is used to integrate with Visual SourceSafe from the following Microsoft Web site:
- 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