You are currently offline, waiting for your internet to reconnect

How to open a SourceSafe database with OLE Automation in C++

This article was previously published under Q169928
This article has been archived. It is offered "as is" and will no longer be updated.
This article contains sample C++ code along with an explanation of how toget a pointer to a SourceSafe database object and execute the Open methodto start a session with a SourceSafe database.
Visual SourceSafe must be registered before you can use its OLE AutomationModel. The following CLSID should be found in HKEY_CLASSES_ROOT/CLSID:{783CD4E4-9D54-11CF-B8EE-00608CC9A71F}. Registration occurs by default whenyou install the SourceSafe Client.

To work with the objects in the SourceSafe OLE Model, first you must haveaccess to a VSSDatabase object, and call its Open method.
  1. Use the CLSIDFromProgID function to obtain the CLSID from the registry as shown in the example below.
  2. Call CoGetClassObject with the CLSID obtained in Step 1 asking for a pointer to the IClassFactory Interface.
  3. Use the CreateInstance Method from the IClassFactory interface to obtain a pointer to an IVSSDatabase object.
  4. Call the open method of the IVSSDatabase object passing in the path to the srcsafe.ini, a valid User Name and password as BSTRs.
Note You can use the SysAllocString function to convert an OLECHAR* to a BSTR.

Use the MultiByteToWide function to convert an LPSTR to OLECHAR* as shownin the following code fragment:
   if((x=MultiByteToWideChar(CP_ACP,0,path,-1,svalue,0)) != 1)   {     svalue = (OLECHAR*)malloc( x*sizeof(wchar_t) );     if(MultiByteToWideChar(CP_ACP, 0, path, -1, svalue, x ) == 0)       MessageBox( NULL, "Error in Conversion", "Multibytetowide", MB_OK );   }   else     svalue = L"";				
MultiByteToWide counts the characters and determines the size of the bufferneeded to hold the BSTR. The appropriate size buffer is then allocated andthe conversion is done. In the example above svalue is an OLECHAR*, andpath is an LPSTR.

Sample code

The following sample code demonstrates how to open a SourceSafe database asdescribed above:
   // Be sure to link with the following libraries:   // user32.lib uuid.lib oleaut32.lib ole32.lib   #define INITGUID   #include <windows.h>   #include <ocidl.h>   #include "ssauto.h"   int main () {     CLSID clsid;     IClassFactory *pClf;     IVSSDatabase *pVdb;     BSTR bstrPath = SysAllocString(L"c:\\VSSclient\\srcsafe.ini");     BSTR bstrUName = SysAllocString(L"guest");     BSTR bstrUPass = SysAllocString(L"");     CoInitialize(0);     if(S_OK == CLSIDFromProgID(L"SourceSafe", &amp;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))           {             //Database Successfully Opened!             //Add code here to use the open database.           }           pVdb->Release();         }         pClf->Release();       }     }     CoUninitialize();     SysFreeString(bstrPath);     SysFreeString(bstrUName);     SysFreeString(bstrUPass);     return 0;   }				
MSDN Library: SysAllocString; SysFreeString; CLSIDFromProgID;IClassFactory; CoGetClassObject; Visual SourceSafe OLE Automation

The header file ssauto.h can be downloaded from the following Web site:

Article ID: 169928 - Last Review: 02/21/2014 00:28:35 - Revision: 2.0

Microsoft Visual SourceSafe 5.0 Standard Edition, Microsoft Visual SourceSafe 6.0 Standard Edition

  • kbnosurvey kbarchive kbhowto KB169928