//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996 // // File: openobj.cxx // // Contents: ADs Wrapper Function to open an Active Directory object // // // History: 11-15-95 krishnag Created. // //---------------------------------------------------------------------------- #include "oleds.hxx" #pragma hdrstop extern PROUTER_ENTRY g_pRouterHead; extern CRITICAL_SECTION g_csRouterHeadCritSect; //+--------------------------------------------------------------------------- // Function: ADsOpenObject // // Synopsis: // // Arguments: [LPWSTR lpszPathName] // [LPWSTR lpszUserName] // [LPWSTR lpszPassword] // [REFIID riid] // [void FAR * FAR * ppObject] // // Returns: HRESULT // // Modifies: - // // History: 07-12-96 krishnag Created. // //---------------------------------------------------------------------------- HRESULT ADsOpenObject( LPCWSTR lpszPathName, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwReserved, REFIID riid, void FAR * FAR * ppObject ) { IADsOpenDSObject FAR * pNamespace = NULL; IDispatch FAR * pDispatch = NULL; HRESULT hr = S_OK; GUID NamespaceClsid; WCHAR lpszProgId[MAX_PATH]; hr = CopyADsProgId( (LPWSTR)lpszPathName, lpszProgId ); BAIL_ON_FAILURE( hr ); hr = ADsGetCLSIDFromProgID( lpszProgId, &NamespaceClsid ); BAIL_ON_FAILURE( hr ); hr = CoCreateInstance( NamespaceClsid, NULL, CLSCTX_INPROC_SERVER, IID_IADsOpenDSObject, (void **)&pNamespace ); BAIL_ON_FAILURE( hr ); hr = pNamespace->OpenDSObject( (LPWSTR)lpszPathName, (LPWSTR)lpszUserName, (LPWSTR)lpszPassword, (long)dwReserved, &pDispatch ); BAIL_ON_FAILURE( hr ); hr = pDispatch->QueryInterface( riid, ppObject ); error: if( pDispatch ) { pDispatch->Release(); } if( pNamespace ) { pNamespace->Release(); } RRETURN( hr ); } //+--------------------------------------------------------------------------- // Function: CopyADsProgId // // Synopsis: // // // Arguments: [LPWSTR Path] // [LPWSTR szProgId] // // Returns: HRESULT // // Modifies: - // // History: 09-16-96 krishnag Created // //---------------------------------------------------------------------------- HRESULT CopyADsProgId( LPWSTR Path, LPWSTR szProgId ) { LPWSTR pChar = NULL; if( !Path ) return E_FAIL; pChar = szProgId; if( *Path == L'@' ) { while (*Path != L'!' && *Path != L'\0') { *pChar = *Path; pChar++; Path++; } if( *Path == L'\0' ) { // // couldn't find the terminating ! for the ProgID // return( E_FAIL ); } }else { while (*Path != L':' && *Path != L'\0') { *pChar = *Path; pChar++; Path++; } if( *Path == L'\0' ) { // // couldn't find the terminating : for the ProgID // return( E_FAIL ); } } *pChar = L'\0'; return S_OK; } HRESULT ADsGetCLSIDFromProgID( LPWSTR pszProgId, GUID * pClsid ) { // // Make sure the router has been initialized // EnterCriticalSection(&g_csRouterHeadCritSect); if (!g_pRouterHead) { g_pRouterHead = InitializeRouter(); } LeaveCriticalSection(&g_csRouterHeadCritSect); PROUTER_ENTRY lpRouter = g_pRouterHead; while (lpRouter){ if (!wcscmp(lpRouter->szProviderProgId, pszProgId)) { memcpy(pClsid, lpRouter->pNamespaceClsid, sizeof(CLSID)); RRETURN(S_OK); } else if (!wcscmp(lpRouter->szAliases, pszProgId)) { // // Check Aliases // memcpy(pClsid, lpRouter->pNamespaceClsid, sizeof(CLSID)); RRETURN(S_OK); } lpRouter = lpRouter->pNext; } RRETURN( E_ADS_BAD_PATHNAME ); }