259 lines
6 KiB
C++
259 lines
6 KiB
C++
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1996
|
||
|
//
|
||
|
// File: get.cxx
|
||
|
//
|
||
|
// Contents: Get Object
|
||
|
//
|
||
|
// History: 04-23-96 KrishnaG created
|
||
|
// 08-01-96 t-danal add to oledscmd w/getrobj
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "main.hxx"
|
||
|
#include "macro.hxx"
|
||
|
#include "sconv.hxx"
|
||
|
|
||
|
//
|
||
|
// Local functions
|
||
|
//
|
||
|
|
||
|
HRESULT
|
||
|
GetObject(
|
||
|
LPWSTR szLocation
|
||
|
);
|
||
|
|
||
|
HRESULT
|
||
|
GetRelativeObject(
|
||
|
LPWSTR szLocation,
|
||
|
LPWSTR szClass,
|
||
|
LPWSTR szName
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Local function definitions
|
||
|
//
|
||
|
|
||
|
HRESULT
|
||
|
GetObject(
|
||
|
LPWSTR szPath
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr, hr_return;
|
||
|
IADs * pADs = NULL;
|
||
|
DWORD dwLastError;
|
||
|
WCHAR szErrorBuf[MAX_PATH];
|
||
|
WCHAR szNameBuf[MAX_PATH];
|
||
|
|
||
|
hr = ADsGetObject(
|
||
|
szPath,
|
||
|
IID_IADs,
|
||
|
(void **)&pADs
|
||
|
);
|
||
|
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
|
||
|
|
||
|
if(HRESULT_FROM_WIN32(ERROR_EXTENDED_ERROR)== hr){
|
||
|
//
|
||
|
// get extended error value
|
||
|
//
|
||
|
hr_return = ADsGetLastError( &dwLastError,
|
||
|
szErrorBuf,
|
||
|
MAX_PATH-1,
|
||
|
szNameBuf,
|
||
|
MAX_PATH -1 );
|
||
|
|
||
|
if (SUCCEEDED(hr_return)){
|
||
|
printf("%d:%ws in provider %ws\n", dwLastError, szErrorBuf, szNameBuf);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
printf("getobj: Successfully bound to object %ws\n",
|
||
|
szPath);
|
||
|
}else {
|
||
|
printf("getobj: Failed to bind to the object with error code %.8x\n",
|
||
|
hr);
|
||
|
}
|
||
|
|
||
|
if (pADs){
|
||
|
pADs->Release();
|
||
|
}
|
||
|
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
GetRelativeObject(
|
||
|
LPWSTR szLocation,
|
||
|
LPWSTR szClass,
|
||
|
LPWSTR szName
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IADsContainer * pADsContainer = NULL;
|
||
|
IDispatch * pDispatch = NULL;
|
||
|
|
||
|
hr = ADsGetObject(
|
||
|
szLocation,
|
||
|
IID_IADsContainer,
|
||
|
(void **)&pADsContainer
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pADsContainer->GetObject(
|
||
|
szClass,
|
||
|
szName,
|
||
|
&pDispatch
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
printf("getrobj: Successfully bound to relative object "
|
||
|
"%ws from container object %ws\n",
|
||
|
szName, szLocation);
|
||
|
}
|
||
|
|
||
|
if (pDispatch) {
|
||
|
pDispatch->Release();
|
||
|
}
|
||
|
|
||
|
if (pADsContainer) {
|
||
|
pADsContainer->Release();
|
||
|
}
|
||
|
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
GetTransientObjects(
|
||
|
LPWSTR szContainer,
|
||
|
LPWSTR szType,
|
||
|
IADs **ppADs,
|
||
|
IADsCollection **ppCollection
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IADs * pADs = NULL;
|
||
|
IADsCollection * pCollection = NULL;
|
||
|
IADsPrintQueueOperations * pPrintQueueOperation = NULL;
|
||
|
IADsFileServiceOperations * pFileServiceOperation = NULL;
|
||
|
|
||
|
if (ppADs)
|
||
|
*ppADs = NULL;
|
||
|
if (ppCollection)
|
||
|
*ppCollection = NULL;
|
||
|
|
||
|
hr = ADsGetObject(
|
||
|
szContainer,
|
||
|
IID_IADs,
|
||
|
(void **)&pADs
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// printf("ADs Get objects succeeded \n");
|
||
|
//
|
||
|
|
||
|
if (_wcsicmp(szType, L"Job") == 0){
|
||
|
hr = pADs->QueryInterface(IID_IADsPrintQueueOperations,
|
||
|
(void **)&pPrintQueueOperation );
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pPrintQueueOperation->PrintJobs(&pCollection);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
pPrintQueueOperation -> Release();
|
||
|
pPrintQueueOperation = NULL;
|
||
|
|
||
|
} else if (_wcsicmp(szType, L"Session") == 0){
|
||
|
hr = pADs->QueryInterface(IID_IADsFileServiceOperations,
|
||
|
(void **)&pFileServiceOperation );
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pFileServiceOperation->Sessions(&pCollection);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
pFileServiceOperation -> Release();
|
||
|
pFileServiceOperation = NULL;
|
||
|
|
||
|
} else if (_wcsicmp(szType, L"Resource") == 0){
|
||
|
hr = pADs->QueryInterface(IID_IADsFileServiceOperations,
|
||
|
(void **)&pFileServiceOperation );
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pFileServiceOperation->Resources(&pCollection);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
pFileServiceOperation -> Release();
|
||
|
pFileServiceOperation = NULL;
|
||
|
|
||
|
} else {
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
if (ppADs)
|
||
|
*ppADs = pADs;
|
||
|
if (ppCollection)
|
||
|
*ppCollection = pCollection;
|
||
|
return S_OK;
|
||
|
|
||
|
error:
|
||
|
if (pADs)
|
||
|
pADs->Release();
|
||
|
if (pPrintQueueOperation)
|
||
|
pPrintQueueOperation->Release();
|
||
|
if (pFileServiceOperation)
|
||
|
pFileServiceOperation->Release();
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Exec function definitions
|
||
|
//
|
||
|
|
||
|
int
|
||
|
ExecGet(char *szProgName, char *szAction, int argc, char * argv[])
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
LPWSTR pszContainer = NULL;
|
||
|
LPWSTR pszClass = NULL;
|
||
|
LPWSTR pszName = NULL;
|
||
|
|
||
|
switch (argc) {
|
||
|
case 1:
|
||
|
ALLOC_UNICODE_WITH_BAIL_ON_NULL(pszName, argv[0]);
|
||
|
hr = GetObject(pszName);
|
||
|
break;
|
||
|
case 2:
|
||
|
ALLOC_UNICODE_WITH_BAIL_ON_NULL(pszContainer, argv[0]);
|
||
|
ALLOC_UNICODE_WITH_BAIL_ON_NULL(pszName, argv[1]);
|
||
|
hr = GetRelativeObject(pszContainer, pszClass, pszName);
|
||
|
break;
|
||
|
case 3:
|
||
|
ALLOC_UNICODE_WITH_BAIL_ON_NULL(pszContainer, argv[0]);
|
||
|
ALLOC_UNICODE_WITH_BAIL_ON_NULL(pszClass, argv[1]);
|
||
|
ALLOC_UNICODE_WITH_BAIL_ON_NULL(pszName, argv[2]);
|
||
|
hr = GetRelativeObject(pszContainer, pszClass, pszName);
|
||
|
break;
|
||
|
default:
|
||
|
PrintUsage(szProgName, szAction,
|
||
|
"\n\t[ <ADsPath of Object> |"
|
||
|
"\n\t <Container> <Object> |"
|
||
|
"\n\t <Container> <Class> <Object> ]");
|
||
|
return(1);
|
||
|
}
|
||
|
error:
|
||
|
FreeUnicodeString(pszContainer);
|
||
|
FreeUnicodeString(pszClass);
|
||
|
FreeUnicodeString(pszName);
|
||
|
if (FAILED(hr))
|
||
|
return(1);
|
||
|
return(0) ;
|
||
|
}
|