//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996 // // File: getobj.cxx // // Contents: ADs Wrapper Function to mimic Visual Basic's GetObject // // // History: 11-15-95 krishnag Created. // 07-12-96 t-danal Added path validation. // //---------------------------------------------------------------------------- #include "oleds.hxx" #pragma hdrstop extern PROUTER_ENTRY g_pRouterHead; extern CRITICAL_SECTION g_csRouterHeadCritSect; BOOL IsPathOfProgId( LPWSTR ProgId, LPWSTR Path ); BOOL IsADsProgId( LPWSTR Path ); //+--------------------------------------------------------------------------- // Function: ADsGetObject // // Synopsis: // // Arguments: [LPWSTR lpszPathName] // [REFIID riid] // [void FAR * FAR * ppObject] // // Returns: HRESULT // // Modifies: - // // History: 07-12-95 t-danal Created. // //---------------------------------------------------------------------------- HRESULT ADsGetObject( LPCWSTR lpszPathName, REFIID riid, void FAR * FAR * ppObject ) { HRESULT hr; hr = GetObject((LPWSTR)lpszPathName, riid, ppObject, FALSE); RRETURN(hr); } //+--------------------------------------------------------------------------- // Function: GetObject // // Synopsis: // // Arguments: [LPWSTR lpszPathName] // [REFIID riid] // [void FAR * FAR * ppObject] // [BOOL Generic] // // Returns: HRESULT // // Modifies: - // // History: 11-03-95 krishnag Created. // 07-12-95 t-danal Added router verification and // renamed from ADsGetObject // //---------------------------------------------------------------------------- HRESULT GetObject( LPWSTR lpszPathName, REFIID riid, void FAR * FAR * ppObject, BOOL bRelative ) { HRESULT hr; ULONG chEaten = 0L; IMoniker * pMoniker = NULL; IBindCtx *pbc = NULL; WCHAR* lpszProgId = NULL; if (!lpszPathName) return E_FAIL; lpszProgId = new WCHAR[wcslen(lpszPathName) + 1]; if(!lpszProgId) { hr = E_OUTOFMEMORY; BAIL_IF_ERROR(hr); } hr = CopyADsProgId( (LPWSTR)lpszPathName, lpszProgId ); BAIL_IF_ERROR( hr ); // // Make sure the router has been initialized // EnterCriticalSection(&g_csRouterHeadCritSect); if (!g_pRouterHead) { g_pRouterHead = InitializeRouter(); } LeaveCriticalSection(&g_csRouterHeadCritSect); PROUTER_ENTRY lpRouter = g_pRouterHead; // // Check if the Path matches with ProviderProgId or the Aliases // // ADs is a special case, and we also did not differentiate between uppercase and lowercase before, so keep this unchanged if(_wcsicmp(lpszProgId, L"ADs")) { while (lpRouter && (!IsPathOfProgId(lpRouter->szProviderProgId, lpszProgId) && !IsPathOfProgId(lpRouter->szAliases, lpszProgId))) lpRouter = lpRouter->pNext; if (!lpRouter) BAIL_IF_ERROR(hr=E_FAIL); } hr = CreateBindCtx(0, &pbc); BAIL_IF_ERROR(hr); hr = MkParseDisplayName(pbc, lpszPathName, &chEaten, &pMoniker); BAIL_IF_ERROR(hr); hr = pMoniker->BindToObject(pbc, NULL, riid, ppObject); BAIL_IF_ERROR(hr); cleanup: if (pbc) { pbc->Release(); } if (pMoniker) { pMoniker->Release(); } if(lpszProgId) { delete [] lpszProgId; lpszProgId = NULL; } RRETURN(hr); } //+--------------------------------------------------------------------------- // Function: IsPathOfProgId // // Synopsis: Checks if an OLE Path corresponds to given ProgId. // Path must be @Foo! or Foo: style. // // Arguments: [LPWSTR ProgId] // [LPWSTR Path] // // Returns: BOOL // // Modifies: - // // History: 07-12-95 t-danal Created // //---------------------------------------------------------------------------- BOOL IsPathOfProgId( LPWSTR ProgId, LPWSTR Path ) { if (!ProgId || !Path) // Just in case... return FALSE; if(wcscmp(ProgId, Path)) return FALSE; return TRUE; } //+--------------------------------------------------------------------------- // Function: IsADsProgId // // Synopsis: Checks if the ProgIds of paths is ADs progid. // Paths must be @Foo! or Foo: style. // // Arguments: [LPWSTR Path] // // Returns: BOOL // // Modifies: - // // History: 07-12-95 t-danal Created // //---------------------------------------------------------------------------- BOOL IsADsProgId( LPWSTR Path ) { int cch = 0; LPWSTR pEnd; if (!Path) return FALSE; if (*Path == L'@') Path++; pEnd = Path; while (*pEnd && *pEnd != L'!' && *pEnd != L':') { pEnd++; } if (_wcsnicmp(L"ADS", Path, (int)(pEnd-Path))) return FALSE; return TRUE; }