home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / ADSDK.ZIP / Samples / ActiveDir / IsMemberEx / vc / ADSIhelpers.cpp next >
Encoding:
C/C++ Source or Header  |  1999-04-05  |  36.6 KB  |  1,068 lines

  1. /*
  2.  
  3.     ADSIHelpers.CPP
  4.  
  5.     General helper rountines for Debugging ADSI applications
  6.  
  7.  
  8. */
  9.  
  10. #define INC_OLE2
  11. #define UNICODE 1
  12. #define _WIN32_DCOM
  13.  
  14. // If defined, will throw a WCHAR * on an error 
  15. // in AdsMsagBox()
  16. #define THROW_CHARPTR_ONERROR
  17.  
  18. #include "stdafx.h"
  19.  
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25.  
  26. #include "ADSIhelpers.h"
  27.  
  28.  
  29.  
  30. #include <windows.h>
  31. #include <OBJIDL.H>
  32. #include <OAIDL.H>
  33. #include <COMCAT.H>
  34. #include <DOCOBJ.H>
  35. #include <HLINK.H>
  36. #include <MTX.H>
  37. #include <MTXSPM.H>
  38. #include <stdio.h>
  39. #include <string.h> 
  40. #include <stdio.h>
  41. #include <string.h>
  42. #include <assert.h>
  43.  
  44. //////////////////////////////////////////////
  45. //  Debugging Functions
  46.  
  47.  
  48.  
  49. // Will display a message box for a BAD Hresult.
  50. // Will do nothing for a S_OK HRESULT
  51. // Pass in the HRESULT to be tested and a char * describing the
  52. // area in the code 
  53. void CheckHRESULT(HRESULT hr, const char *pszCause)
  54. {
  55.     if (FAILED(hr))
  56.     {
  57.         char sz[1024];
  58.         char szCaption[1024];
  59.         strcpy(szCaption, pszCause);
  60.         strcat(szCaption, " failed!");
  61.         if (!FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, hr, 0, sz, 1024, 0))
  62.             strcpy(sz, "Unknown error");
  63.         MessageBoxA(0, sz, szCaption, MB_SETFOREGROUND);
  64.        // DebugBreak();
  65.     }
  66. }
  67.  
  68.  
  69. // When passed a VARIANT vt member, will return a string describing
  70. // all the bitmask settings...
  71. const char * GetVariantStyle(VARTYPE vt)
  72. {
  73.     static char pRet[200]; 
  74.  
  75.     pRet[0] = NULL;
  76.     
  77.     if (vt == VT_EMPTY) strcat(pRet,"VT_EMPTY ");
  78.  
  79.     if (HAS_BIT_STYLE(vt, VT_BYREF)) strcat(pRet,"VT_BYREF ");
  80.     if (HAS_BIT_STYLE(vt, VT_UI1)) strcat(pRet,"VT_UI1 ");
  81.     if (HAS_BIT_STYLE(vt, VT_I2)) strcat(pRet,"VT_I2 ");
  82.     if (HAS_BIT_STYLE(vt, VT_I4)) strcat(pRet,"VT_I4 ");
  83.     if (HAS_BIT_STYLE(vt, VT_R4)) strcat(pRet,"VT_R4 ");
  84.     if (HAS_BIT_STYLE(vt, VT_R8)) strcat(pRet,"VT_R8 ");
  85.     if (HAS_BIT_STYLE(vt, VT_CY)) strcat(pRet,"VT_CY ");
  86.     if (HAS_BIT_STYLE(vt, VT_BSTR)) strcat(pRet,"VT_BSTR ");
  87.     if (HAS_BIT_STYLE(vt, VT_NULL)) strcat(pRet,"VT_NULL ");
  88.     if (HAS_BIT_STYLE(vt, VT_ERROR)) strcat(pRet,"VT_ERROR ");
  89.     if (HAS_BIT_STYLE(vt, VT_BOOL)) strcat(pRet,"VT_BOOL ");
  90.     if (HAS_BIT_STYLE(vt, VT_DATE)) strcat(pRet,"VT_DATE ");
  91.     if (HAS_BIT_STYLE(vt, VT_DISPATCH)) strcat(pRet,"VT_DISPATCH ");
  92.     if (HAS_BIT_STYLE(vt, VT_VARIANT)) strcat(pRet,"VT_VARIANT ");
  93.     if (HAS_BIT_STYLE(vt, VT_UNKNOWN)) strcat(pRet,"VT_UNKNOWN ");
  94.     if (HAS_BIT_STYLE(vt, VT_ARRAY)) strcat(pRet,"VT_ARRAY ");
  95.  
  96.     return pRet;          
  97. }
  98.  
  99. // Pass in the interface ptr to the property value
  100. // will return a BSTR value of the data.
  101. // The IADsPropertyValue::get_ADsType()  is called to retrieve the 
  102. // ADSTYPE valued enum 
  103. // This enum is then used to determine which IADsPropertyValue method
  104. // to call to receive the actual data
  105.  
  106. // CALLER assumes responsibility for freeing returned BSTR
  107. HRESULT    GetIADsPropertyValueAsBSTR(BSTR * pbsRet,IADsPropertyValue * pAdsPV)
  108. {
  109.     HRESULT hr = S_OK;
  110.  
  111.     long lAdsType;
  112.     hr = pAdsPV->get_ADsType(&lAdsType);
  113.     
  114.     if (FAILED(hr))
  115.         return hr;
  116.  
  117.     switch (lAdsType)
  118.     {
  119.         case ADSTYPE_INVALID :
  120.         {
  121.             *pbsRet = SysAllocString(L"<ADSTYPE_INVALID>");
  122.         }
  123.         break;
  124.  
  125.         case ADSTYPE_DN_STRING :
  126.         {
  127.             hr = pAdsPV->get_DNString(pbsRet);
  128.         }
  129.         break;
  130.         case ADSTYPE_CASE_EXACT_STRING :
  131.         {
  132.             hr = pAdsPV->get_CaseExactString(pbsRet);
  133.         }
  134.         break;
  135.         case ADSTYPE_CASE_IGNORE_STRING :
  136.         {
  137.             hr = pAdsPV->get_CaseIgnoreString(pbsRet);
  138.         }
  139.         break;
  140.         case ADSTYPE_PRINTABLE_STRING :
  141.         {
  142.             hr = pAdsPV->get_PrintableString(pbsRet);
  143.         }
  144.         break;
  145.         case ADSTYPE_NUMERIC_STRING :
  146.         {
  147.             hr = pAdsPV->get_NumericString(pbsRet);
  148.         }
  149.         break;
  150.         case ADSTYPE_BOOLEAN :
  151.         {
  152.             long b;
  153.             hr = pAdsPV->get_Boolean(&b);
  154.             if (SUCCEEDED(hr))
  155.             {
  156.                 if (b)
  157.                     *pbsRet = SysAllocString(L"<TRUE>");
  158.                 else
  159.                     *pbsRet = SysAllocString(L"<FALSE>");
  160.             }
  161.         }
  162.         break;
  163.         case ADSTYPE_INTEGER :
  164.         {
  165.             long lInt;
  166.             hr = pAdsPV->get_Integer(&lInt);
  167.             if (SUCCEEDED(hr))
  168.             {
  169.                 WCHAR wOut[100];
  170.                 wsprintf(wOut,L"%d",lInt);
  171.                 *pbsRet = SysAllocString(wOut);
  172.             }
  173.         }
  174.         break;
  175.         case ADSTYPE_OCTET_STRING :
  176.         {
  177.             *pbsRet = SysAllocString(L"<ADSTYPE_LARGE_INTEGER>");
  178.             //    hr = pAdsPV->get_OctetString(pbsRet);
  179.         }
  180.         break;
  181.         case ADSTYPE_UTC_TIME :
  182.         {
  183.             DATE daUTCTime;
  184.             WCHAR wDateOut[255];
  185.             hr = pAdsPV->get_UTCTime(&daUTCTime);
  186.             
  187.             if (SUCCEEDED(hr))
  188.             {            
  189.             /*    wsprintf(wDateout,L"%02d/%02d/%04d %02d:%02d:%02d", 
  190.                     pValues->UTCTime.wMonth, pValues->UTCTime.wDay, pValues->UTCTime.wYear,
  191.                     pValues->UTCTime.wHour, pValues->UTCTime.wMinute, pValues->UTCTime.wSecond );
  192.             */
  193.                 *pbsRet = SysAllocString(wDateOut);
  194.             }
  195.         }
  196.         break;
  197.         case ADSTYPE_LARGE_INTEGER :
  198.         {
  199.             *pbsRet = SysAllocString(L"<ADSTYPE_LARGE_INTEGER>");
  200.         }
  201.         break;
  202.         case ADSTYPE_PROV_SPECIFIC :
  203.         {
  204.             *pbsRet = SysAllocString(L"<ADSTYPE_PROV_SPECIFIC>");
  205.         }
  206.         break;
  207.         case ADSTYPE_OBJECT_CLASS :
  208.         {
  209.             *pbsRet = SysAllocString(L"<ADSTYPE_OBJECT_CLASS>");
  210.         }
  211.         break;
  212.         case ADSTYPE_PATH :
  213.         {
  214.             *pbsRet = SysAllocString(L"<ADSTYPE_PATH>");
  215.         }
  216.         break;
  217.         case ADSTYPE_NT_SECURITY_DESCRIPTOR :
  218.         {
  219.             *pbsRet = SysAllocString(L"<ADSTYPE_NT_SECURITY_DESCRIPTOR>");
  220.         }
  221.         break;
  222.     
  223.         default: 
  224.             *pbsRet = SysAllocString(L"<UNRECOGNIZED>");
  225.         break;
  226.             
  227.     }    
  228.     return hr;
  229. }
  230.  
  231. // Displays a Messagebox with a BAD Hresult
  232. // Supports standard system COM errors
  233. // And Active Directory Errors
  234. void ADErrMsgBox(HRESULT passedhr)
  235. {
  236.     
  237.     if (SUCCEEDED(passedhr))
  238.         return;
  239.  
  240.     HRESULT hr;
  241.     DWORD lError;
  242.     WCHAR pwErrBuff[2048];
  243.     WCHAR pwADErrBuff[512];
  244.  
  245.     WCHAR * pADErrCodeStr;
  246.     
  247.     pwErrBuff[0] = NULL;
  248.     pADErrCodeStr = CrackADError( passedhr);
  249.  
  250.     // If an ADSI error code was returned, display it
  251.     if (pADErrCodeStr[0] != NULL)
  252.     {
  253.         wcscat(pwErrBuff,L"\t<*> ADSI Error HRESULT Returns: <*> \n");
  254.         wcscat(pwErrBuff,pADErrCodeStr);
  255.         wcscat(pwErrBuff,L"\n");
  256.     }           
  257.     
  258.     // Call ADsGetLastError() to retrieve the error text from ADSI
  259.     wcscat(pwErrBuff,L"\t<*> ADSI Error: <*>\n");
  260.     
  261.     hr = ADsGetLastError(
  262.         &lError,
  263.         pwADErrBuff,
  264.         2047,
  265.         L"",
  266.         0
  267.         );
  268.  
  269.  
  270.     if (FAILED(hr))
  271.         wcscat(pwErrBuff,L"<Unable to retrieve ADs Error>");
  272.     else
  273.         wcscat(pwErrBuff,pwADErrBuff);
  274.  
  275.     wcscat(pwErrBuff,L"\n");
  276.     
  277.     WCHAR sz[1024];
  278.     
  279.     wcscat(pwErrBuff,L"\t<*> System Error: <*> \n");
  280.  
  281.     // Check the standard system to crack the bad HRESULT into a string
  282.     if (!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, 0, passedhr, 0, sz, 1024, 0))
  283.         wcscat(sz, L"Unknown HRESULT error");
  284.     else
  285.         wcscat(pwErrBuff, sz);
  286.         
  287.     // Display
  288.     OutputDebugStringW(pwErrBuff);
  289.     OutputDebugStringW(L"\r\n");
  290.     MessageBoxW(NULL,pwErrBuff,L"ADErrMsgBox():",MB_OK);
  291.  
  292.     #ifdef _DEBUG
  293.         DebugBreak();
  294.     #endif
  295.  
  296.     #ifdef THROW_CHARPTR_ONERROR
  297.         throw pwErrBuff;
  298.     #endif
  299.  
  300.  
  301. }
  302.  
  303.  
  304. WCHAR * CrackADError(HRESULT hResult)
  305. {
  306.    static WCHAR szwText[ 128 ];
  307.    szwText[0] = 0l;
  308.  
  309.    switch( hResult )
  310.    {
  311.       case  E_ADS_BAD_PATHNAME:
  312.          return L"E_ADS_BAD_PATHNAME";
  313.          break;
  314.  
  315.       case  E_ADS_INVALID_DOMAIN_OBJECT:
  316.          return L"E_ADS_INVALID_DOMAIN_OBJECT";
  317.          break;
  318.  
  319.       case  E_ADS_INVALID_USER_OBJECT:
  320.          return L"E_ADS_INVALID_USER_OBJECT";
  321.          break;
  322.  
  323.       case  E_ADS_INVALID_COMPUTER_OBJECT:
  324.          return L"E_ADS_INVALID_COMPUTER_OBJECT";
  325.          break;
  326.  
  327.       case  E_ADS_UNKNOWN_OBJECT:
  328.          return L"E_ADS_UNKNOWN_OBJECT";
  329.          break;
  330.  
  331.       case  E_ADS_PROPERTY_NOT_SET:
  332.          return L"E_ADS_PROPERTY_NOT_SET";
  333.          break;
  334.  
  335.       case  E_ADS_PROPERTY_NOT_SUPPORTED:
  336.          return L"E_ADS_PROPERTY_NOT_SUPPORTED";
  337.          break;
  338.  
  339.       case  E_ADS_PROPERTY_INVALID:
  340.          return L"E_ADS_PROPERTY_INVALID";
  341.          break;
  342.  
  343.       case  E_ADS_BAD_PARAMETER:
  344.          return L"E_ADS_BAD_PARAMETER";
  345.          break;
  346.  
  347.       case  E_ADS_OBJECT_UNBOUND:
  348.          return L"E_ADS_OBJECT_UNBOUND";
  349.          break;
  350.  
  351.       case  E_ADS_PROPERTY_NOT_MODIFIED:
  352.          return L"E_ADS_PROPERTY_NOT_MODIFIED";
  353.          break;
  354.  
  355.       case  E_ADS_PROPERTY_MODIFIED:
  356.          return L"E_ADS_PROPERTY_MODIFIED";
  357.          break;
  358.  
  359.       case  E_ADS_CANT_CONVERT_DATATYPE:
  360.          return L"E_ADS_CANT_CONVERT_DATATYPE";
  361.          break;
  362.  
  363.       case  E_ADS_PROPERTY_NOT_FOUND:
  364.          return L"E_ADS_PROPERTY_NOTFOUND";
  365.          break;
  366.  
  367.       case  E_ADS_OBJECT_EXISTS:
  368.          return L"E_ADS_OBJECT_EXISTS";
  369.          break;
  370.  
  371.       case  E_ADS_SCHEMA_VIOLATION:
  372.          return L"E_ADS_SCHEMA_VIOLATION";
  373.          break;
  374.  
  375.       case  E_ADS_COLUMN_NOT_SET:
  376.          return L"E_ADS_COLUMN_NOT_SET";
  377.          break;
  378.  
  379.       case  E_ADS_INVALID_FILTER:
  380.          return L"E_ADS_INVALID_FILTER";
  381.          break;
  382.  
  383.       case  HRESULT_FROM_WIN32(ERROR_DS_OPERATIONS_ERROR):
  384.          return L"ERROR_DS_OPERATIONS_ERROR";
  385.          break;
  386.  
  387.       case  HRESULT_FROM_WIN32(ERROR_DS_PROTOCOL_ERROR):
  388.          return L"ERROR_DS_PROTOCOL_ERROR";
  389.          break;
  390.  
  391.       case  HRESULT_FROM_WIN32(ERROR_DS_TIMELIMIT_EXCEEDED):
  392.          return L"ERROR_DS_TIMELIMIT_EXCEEDED";
  393.          break;
  394.  
  395.       case  HRESULT_FROM_WIN32(ERROR_DS_SIZELIMIT_EXCEEDED):
  396.          return L"ERROR_DS_SIZELIMIT_EXCEEDED";
  397.          break;
  398.  
  399.       case  HRESULT_FROM_WIN32(ERROR_DS_COMPARE_FALSE):
  400.          return L"ERROR_DS_COMPARE_FALSE";
  401.          break;
  402.  
  403.  
  404.       case  HRESULT_FROM_WIN32(ERROR_DS_COMPARE_TRUE):
  405.          return L"ERROR_DS_COMPARE_TRUE";
  406.          break;
  407.  
  408.       case  HRESULT_FROM_WIN32(ERROR_DS_AUTH_METHOD_NOT_SUPPORTED):
  409.          return L"ERROR_DS_AUTH_METHOD_NOT_SUPPORTED";
  410.          break;
  411.  
  412.  
  413.       case  HRESULT_FROM_WIN32(ERROR_DS_STRONG_AUTH_REQUIRED):
  414.          return L"ERROR_DS_STRONG_AUTH_REQUIRED";
  415.          break;
  416.  
  417.  
  418.       case  HRESULT_FROM_WIN32(ERROR_MORE_DATA):
  419.          return L"ERROR_MORE_DATA";
  420.          break;
  421.  
  422.       case  HRESULT_FROM_WIN32(ERROR_DS_REFERRAL):
  423.          return L"(ERROR_DS_REFERRAL";
  424.          break;
  425.  
  426.       case  HRESULT_FROM_WIN32(ERROR_DS_ADMIN_LIMIT_EXCEEDED):
  427.          return L"ERROR_DS_ADMIN_LIMIT_EXCEEDED";
  428.          break;
  429.  
  430.       case  HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION):
  431.          return L"(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION";
  432.          break;
  433.  
  434.       case  HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED):
  435.          return L"HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED";
  436.          break;
  437.  
  438.       case  HRESULT_FROM_WIN32(ERROR_DS_NO_ATTRIBUTE_OR_VALUE):
  439.          return L"ERROR_DS_NO_ATTRIBUTE_OR_VALUE";
  440.          break;
  441.  
  442.       case  HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED):
  443.          return L"(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED";
  444.          break;
  445.  
  446.       case  HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_MATCHING):
  447.          return L"(ERROR_DS_INAPPROPRIATE_MATCHING";
  448.          break;
  449.  
  450.       case  HRESULT_FROM_WIN32(ERROR_DS_CONSTRAINT_VIOLATION):
  451.          return L"ERROR_DS_CONSTRAINT_VIOLATION";
  452.          break;
  453.  
  454.       case  HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS):
  455.          return L"ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS";
  456.          break;
  457.  
  458.       case  HRESULT_FROM_WIN32(ERROR_DS_INVALID_ATTRIBUTE_SYNTAX):
  459.          return L"ERROR_DS_INVALID_ATTRIBUTE_SYNTAX";
  460.          break;
  461.  
  462.       case  HRESULT_FROM_WIN32(ERROR_DS_NO_SUCH_OBJECT):
  463.          return L"ERROR_DS_NO_SUCH_OBJECT";
  464.          break;
  465.  
  466.       case  HRESULT_FROM_WIN32(ERROR_DS_INVALID_DN_SYNTAX):
  467.          return L"ERROR_DS_INVALID_DN_SYNTAX";
  468.          break;
  469.  
  470.       case  HRESULT_FROM_WIN32(ERROR_DS_IS_LEAF):
  471.          return L"ERROR_DS_IS_LEAF";
  472.          break;
  473.  
  474.       case  HRESULT_FROM_WIN32(ERROR_DS_ALIAS_DEREF_PROBLEM):
  475.          return L"ERROR_DS_ALIAS_DEREF_PROBLEM";
  476.          break;
  477.  
  478.       case  HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_AUTH):
  479.          return L"ERROR_DS_INAPPROPRIATE_AUTH";
  480.          break;
  481.  
  482.       case  HRESULT_FROM_WIN32(ERROR_INVALID_PASSWORD):
  483.          return L"ERROR_INVALID_PASSWORD";
  484.          break;
  485.  
  486.       case  HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED):
  487.          return L"ERROR_ACCESS_DENIED";
  488.          break;
  489.  
  490.       case  HRESULT_FROM_WIN32(ERROR_DS_BUSY):
  491.          return L"ERROR_DS_BUSY";
  492.          break;
  493.  
  494.       case  HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE):
  495.          return L"ERROR_DS_UNAVAILABLE";
  496.          break;
  497.  
  498.       case  HRESULT_FROM_WIN32(ERROR_DS_UNWILLING_TO_PERFORM):
  499.          return L"ERROR_DS_UNWILLING_TO_PERFORM";
  500.          break;
  501.  
  502.       case  HRESULT_FROM_WIN32(ERROR_DS_LOOP_DETECT):
  503.          return L"ERROR_DS_LOOP_DETECT";
  504.          break;
  505.  
  506.       case  HRESULT_FROM_WIN32(ERROR_DS_NAMING_VIOLATION):
  507.          return L"ERROR_DS_NAMING_VIOLATION";
  508.          break;
  509.  
  510.       case  HRESULT_FROM_WIN32(ERROR_DS_OBJ_CLASS_VIOLATION):
  511.          return L"ERROR_DS_OBJ_CLASS_VIOLATION";
  512.          break;
  513.  
  514.       case  HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_NON_LEAF):
  515.          return L"ERROR_DS_CANT_ON_NONLEAF";
  516.          break;
  517.  
  518.       case  HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_RDN):
  519.          return L"ERROR_DS_CANT_ON_RDN";
  520.          break;
  521.  
  522.       case  HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS):
  523.          return L"ERROR_ALREADY_EXISTS";
  524.          break;
  525.  
  526.       case  HRESULT_FROM_WIN32(ERROR_DS_CANT_MOD_OBJ_CLASS):
  527.          return L"ERROR_DS_CANT_MOD_OBJ_CLASS";
  528.          break;
  529.  
  530.       case  HRESULT_FROM_WIN32(ERROR_DS_OBJECT_RESULTS_TOO_LARGE):
  531.          return L"ERROR_DS_OBJECT_RESULTS_TOO_LARGE";
  532.          break;
  533.  
  534.       case  HRESULT_FROM_WIN32(ERROR_DS_AFFECTS_MULTIPLE_DSAS):
  535.          return L"ERROR_DS_AFFECTS_MULTIPLE_DSAS";
  536.          break;
  537.  
  538.       case  HRESULT_FROM_WIN32(ERROR_GEN_FAILURE):
  539.          return L"(ERROR_GEN_FAILURE";
  540.          break;
  541.  
  542.       case  HRESULT_FROM_WIN32(ERROR_DS_SERVER_DOWN):
  543.          return L"ERROR_DS_SERVER_DOWN";
  544.          break;
  545.  
  546.       case  HRESULT_FROM_WIN32(ERROR_DS_LOCAL_ERROR):
  547.          return L"ERROR_DS_LOCAL_ERROR";
  548.          break;
  549.  
  550.       case  HRESULT_FROM_WIN32(ERROR_DS_ENCODING_ERROR):
  551.          return L"ERROR_DS_ENCODING_ERROR";
  552.          break;
  553.  
  554.       case  HRESULT_FROM_WIN32(ERROR_DS_DECODING_ERROR):
  555.          return L"(ERROR_DS_DECODING_ERROR";
  556.          break;
  557.  
  558.       case  HRESULT_FROM_WIN32(ERROR_TIMEOUT):
  559.          return L"(ERROR_TIMEOUT";
  560.          break;
  561.  
  562.       case  HRESULT_FROM_WIN32(ERROR_DS_AUTH_UNKNOWN):
  563.          return L"ERROR_DS_AUTH_UNKNOWN";
  564.          break;
  565.  
  566.       case  HRESULT_FROM_WIN32(ERROR_DS_FILTER_UNKNOWN):
  567.          return L"(ERROR_DS_FILTER_UNKNOWN";
  568.          break;
  569.  
  570.       case  HRESULT_FROM_WIN32(ERROR_CANCELLED):
  571.          return L"(ERROR_CANCELLED";
  572.          break;
  573.  
  574.       case  HRESULT_FROM_WIN32(ERROR_DS_PARAM_ERROR):
  575.          return L"ERROR_DS_PARAM_ERROR";
  576.          break;
  577.  
  578.       case  HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY):
  579.          return L"ERROR_NOT_ENOUGH_MEMORY";
  580.          break;
  581.  
  582.       case  HRESULT_FROM_WIN32(ERROR_CONNECTION_REFUSED):
  583.          return L"ERROR_CONNECTION_REFUSED";
  584.          break;
  585.  
  586.       case  HRESULT_FROM_WIN32(ERROR_DS_NOT_SUPPORTED):
  587.          return L"ERROR_DS_NOT_SUPPORTED";
  588.          break;
  589.  
  590.       case  HRESULT_FROM_WIN32(ERROR_DS_NO_RESULTS_RETURNED):
  591.          return L"ERROR_DS_NO_RESULTS_RETURNED";
  592.          break;
  593.  
  594.       case  HRESULT_FROM_WIN32(ERROR_DS_CONTROL_NOT_FOUND):
  595.          return L"ERROR_DS_CONTROL_NOT_FOUND";
  596.          break;
  597.  
  598.       case  HRESULT_FROM_WIN32(ERROR_DS_CLIENT_LOOP):
  599.          return L"(ERROR_DS_CLIENT_LOOP";
  600.          break;
  601.  
  602.       case  HRESULT_FROM_WIN32(ERROR_DS_REFERRAL_LIMIT_EXCEEDED):
  603.          return L"ERROR_DS_REFERRAL_LIMIT_EXCEEDED";
  604.          break;
  605.  
  606.       case  E_FAIL:
  607.          return L"E_FAIL";
  608.          break;
  609.  
  610.       case  E_NOTIMPL:
  611.          return L"E_NOIMPL";
  612.          break;
  613.  
  614.       case  S_OK:
  615.          return L"OK";
  616.          break;
  617.  
  618.       case  0x800704b8:
  619.       // we have an extended error
  620.       {
  621.          WCHAR szErrorBuff[ 1024 ];
  622.          WCHAR szNameBuff[ 1024 ];
  623.          DWORD dwError;
  624.  
  625.          ADsGetLastError( &dwError,
  626.                           szErrorBuff,
  627.                           1023,
  628.                           szNameBuff,
  629.                           1023 );
  630.          wcscat( szNameBuff, L" : " );
  631.          wcscat( szNameBuff, szErrorBuff );
  632.          wcscpy( szwText,szNameBuff);
  633.  
  634.          return szwText;
  635.       }
  636.  
  637.    }
  638.  
  639.     return szwText; 
  640. }
  641.  
  642.  
  643.  
  644. // Takes an ADSTYPE and converts it to a string
  645. const char * AdsTypeToChar(long AdsType)
  646. {
  647.     static char pAdsChar[200];
  648.     pAdsChar[0] = NULL;
  649.  
  650.     switch (AdsType)
  651.     {
  652.     
  653.         case ADSTYPE_INVALID :
  654.             strcpy(pAdsChar,"ADSTYPE_INVALID");
  655.         break;
  656.         case ADSTYPE_DN_STRING :
  657.             strcpy(pAdsChar,"ADSTYPE_DN_STRING");
  658.         break;
  659.         case ADSTYPE_CASE_EXACT_STRING :
  660.             strcpy(pAdsChar,"ADSTYPE_CASE_EXACT_STRING");
  661.         break;
  662.         case ADSTYPE_CASE_IGNORE_STRING :
  663.             strcpy(pAdsChar,"ADSTYPE_CASE_IGNORE_STRING");
  664.         break;
  665.         case ADSTYPE_PRINTABLE_STRING :
  666.             strcpy(pAdsChar,"ADSTYPE_PRINTABLE_STRING");
  667.         break;
  668.         case ADSTYPE_NUMERIC_STRING :
  669.             strcpy(pAdsChar,"ADSTYPE_NUMERIC_STRING");
  670.         break;
  671.         case ADSTYPE_BOOLEAN :
  672.             strcpy(pAdsChar,"ADSTYPE_BOOLEAN");
  673.         break;
  674.         case ADSTYPE_INTEGER :
  675.             strcpy(pAdsChar,"ADSTYPE_INTEGER");
  676.         break;
  677.         case ADSTYPE_OCTET_STRING :
  678.             strcpy(pAdsChar,"ADSTYPE_OCTET_STRING");
  679.         break;
  680.         case ADSTYPE_UTC_TIME :
  681.             strcpy(pAdsChar,"ADSTYPE_UTC_TIME");
  682.         break;
  683.         case ADSTYPE_LARGE_INTEGER :
  684.             strcpy(pAdsChar,"ADSTYPE_LARGE_INTEGER");
  685.         break;
  686.         case ADSTYPE_PROV_SPECIFIC :
  687.             strcpy(pAdsChar,"ADSTYPE_PROV_SPECIFIC");
  688.         break;
  689.         case ADSTYPE_OBJECT_CLASS :
  690.             strcpy(pAdsChar,"ADSTYPE_OBJECT_CLASS");
  691.         break;
  692.         case ADSTYPE_PATH :
  693.             strcpy(pAdsChar,"ADSTYPE_PATH");
  694.         break;
  695.         case ADSTYPE_NT_SECURITY_DESCRIPTOR :
  696.             strcpy(pAdsChar,"ADSTYPE_NT_SECURITY_DESCRIPTOR");
  697.         break;
  698.     
  699.         default: 
  700.             strcpy(pAdsChar,"<UNRECOGNIZED>");
  701.         break;
  702.             
  703.     }    
  704.     return pAdsChar;
  705.  
  706.  
  707. }
  708.  
  709.  
  710.                                    
  711. struct IIDLookUp
  712. {
  713.     GUID id;
  714.     char * pIDName;
  715.  
  716.     IIDLookUp(GUID iNewID,char * pNewIDName) :
  717.     id(iNewID), pIDName(pNewIDName) {};
  718. };
  719.  
  720.  
  721. IIDLookUp    arIDs [] = 
  722. {
  723. IIDLookUp(IID_IEnumGUID,                            "IID_IEnumGUID"),                         
  724. IIDLookUp(IID_IEnumCATEGORYINFO,                    "IID_IEnumCATEGORYINFO"),                 
  725. IIDLookUp(IID_ICatRegister,                            "IID_ICatRegister"),                      
  726. IIDLookUp(IID_ICatInformation,                        "IID_ICatInformation"),                   
  727. IIDLookUp(IID_IOleDocument,                            "IID_IOleDocument"),                      
  728. IIDLookUp(IID_IOleDocumentSite,                        "IID_IOleDocumentSite"),                  
  729. IIDLookUp(IID_IOleDocumentView,                        "IID_IOleDocumentView"),                  
  730. IIDLookUp(IID_IEnumOleDocumentViews,                "IID_IEnumOleDocumentViews"),             
  731. IIDLookUp(IID_IContinueCallback,                    "IID_IContinueCallback"),                 
  732. IIDLookUp(IID_IPrint,                                "IID_IPrint"),                            
  733. IIDLookUp(IID_IOleCommandTarget,                    "IID_IOleCommandTarget"),                 
  734. IIDLookUp(IID_IHlink,                                "IID_IHlink"),                            
  735. IIDLookUp(IID_IHlinkSite,                            "IID_IHlinkSite"),                        
  736. IIDLookUp(IID_IHlinkTarget,                            "IID_IHlinkTarget"),                      
  737. IIDLookUp(IID_IHlinkFrame,                            "IID_IHlinkFrame"),                       
  738. IIDLookUp(IID_IEnumHLITEM,                            "IID_IEnumHLITEM"),                       
  739. IIDLookUp(IID_IHlinkBrowseContext,                    "IID_IHlinkBrowseContext"),               
  740. IIDLookUp(IID_ICreateTypeInfo,                        "IID_ICreateTypeInfo"),                   
  741. IIDLookUp(IID_ICreateTypeInfo2,                        "IID_ICreateTypeInfo2"),                  
  742. IIDLookUp(IID_ICreateTypeLib,                        "IID_ICreateTypeLib"),                    
  743. IIDLookUp(IID_ICreateTypeLib2,                        "IID_ICreateTypeLib2"),                   
  744. IIDLookUp(IID_IDispatch,                            "IID_IDispatch"),                         
  745. IIDLookUp(IID_IEnumVARIANT,                            "IID_IEnumVARIANT"),                      
  746. IIDLookUp(IID_ITypeComp,                            "IID_ITypeComp"),                         
  747. IIDLookUp(IID_ITypeInfo,                            "IID_ITypeInfo"),                         
  748. IIDLookUp(IID_ITypeInfo2,                            "IID_ITypeInfo2"),                        
  749. IIDLookUp(IID_ITypeLib,                                "IID_ITypeLib"),                          
  750. IIDLookUp(IID_ITypeLib2,                            "IID_ITypeLib2"),                         
  751. IIDLookUp(IID_ITypeChangeEvents,                    "IID_ITypeChangeEvents"),                 
  752. IIDLookUp(IID_IErrorInfo,                            "IID_IErrorInfo"),                        
  753. IIDLookUp(IID_ICreateErrorInfo,                        "IID_ICreateErrorInfo"),                  
  754. IIDLookUp(IID_ISupportErrorInfo,                    "IID_ISupportErrorInfo"),                 
  755. IIDLookUp(IID_IMarshal,                                "IID_IMarshal"),                          
  756. IIDLookUp(IID_IMalloc,                                "IID_IMalloc"),                           
  757. IIDLookUp(IID_IMallocSpy,                            "IID_IMallocSpy"),                        
  758. IIDLookUp(IID_IStdMarshalInfo,                        "IID_IStdMarshalInfo"),                   
  759. IIDLookUp(IID_IExternalConnection,                    "IID_IExternalConnection"),               
  760. IIDLookUp(IID_IMultiQI,                                "IID_IMultiQI"),                          
  761. IIDLookUp(IID_IEnumUnknown,                            "IID_IEnumUnknown"),                      
  762. IIDLookUp(IID_IBindCtx,                                "IID_IBindCtx"),                          
  763. IIDLookUp(IID_IEnumMoniker,                            "IID_IEnumMoniker"),                      
  764. IIDLookUp(IID_IRunnableObject,                        "IID_IRunnableObject"),                   
  765. IIDLookUp(IID_IRunningObjectTable,                    "IID_IRunningObjectTable"),               
  766. IIDLookUp(IID_IPersist,                                "IID_IPersist"),                          
  767. IIDLookUp(IID_IPersistStream,                        "IID_IPersistStream"),                    
  768. IIDLookUp(IID_IMoniker,                                "IID_IMoniker"),                          
  769. IIDLookUp(IID_IROTData,                                "IID_IROTData"),                          
  770. IIDLookUp(IID_IEnumString,                            "IID_IEnumString"),                       
  771. IIDLookUp(IID_ISequentialStream,                    "IID_ISequentialStream"),                 
  772. IIDLookUp(IID_IStream,                                "IID_IStream"),                           
  773. IIDLookUp(IID_IEnumSTATSTG,                            "IID_IEnumSTATSTG"),                      
  774. IIDLookUp(IID_IStorage,                                "IID_IStorage"),                          
  775. IIDLookUp(IID_IPersistFile,                            "IID_IPersistFile"),                      
  776. IIDLookUp(IID_IPersistStorage,                        "IID_IPersistStorage"),                   
  777. IIDLookUp(IID_ILockBytes,                            "IID_ILockBytes"),                        
  778. IIDLookUp(IID_IEnumFORMATETC,                        "IID_IEnumFORMATETC"),                    
  779. IIDLookUp(IID_IEnumSTATDATA,                        "IID_IEnumSTATDATA"),                     
  780. IIDLookUp(IID_IRootStorage,                            "IID_IRootStorage"),                      
  781. IIDLookUp(IID_IAdviseSink,                            "IID_IAdviseSink"),                       
  782. IIDLookUp(IID_IAdviseSink2,                            "IID_IAdviseSink2"),                      
  783. IIDLookUp(IID_IDataObject,                            "IID_IDataObject"),                       
  784. IIDLookUp(IID_IDataAdviseHolder,                    "IID_IDataAdviseHolder"),                 
  785. IIDLookUp(IID_IMessageFilter,                        "IID_IMessageFilter"),                    
  786. IIDLookUp(IID_IRpcChannelBuffer,                    "IID_IRpcChannelBuffer"),                 
  787. IIDLookUp(IID_IRpcProxyBuffer,                        "IID_IRpcProxyBuffer"),                   
  788. IIDLookUp(IID_IRpcStubBuffer,                        "IID_IRpcStubBuffer"),                    
  789. IIDLookUp(IID_IPSFactoryBuffer,                        "IID_IPSFactoryBuffer"),                  
  790. IIDLookUp(IID_IPropertyStorage,                        "IID_IPropertyStorage"),                  
  791. IIDLookUp(IID_IPropertySetStorage,                    "IID_IPropertySetStorage"),               
  792. IIDLookUp(IID_IEnumSTATPROPSTG,                        "IID_IEnumSTATPROPSTG"),                  
  793. IIDLookUp(IID_IEnumSTATPROPSETSTG,                    "IID_IEnumSTATPROPSETSTG"),               
  794. IIDLookUp(IID_IFillLockBytes,                        "IID_IFillLockBytes"),                    
  795. IIDLookUp(IID_IProgressNotify,                        "IID_IProgressNotify"),                   
  796. IIDLookUp(IID_ILayoutStorage,                        "IID_ILayoutStorage"),                    
  797. IIDLookUp(IID_IEnumConnections,                        "IID_IEnumConnections"),                  
  798. IIDLookUp(IID_IConnectionPoint,                        "IID_IConnectionPoint"),                  
  799. IIDLookUp(IID_IEnumConnectionPoints,                "IID_IEnumConnectionPoints"),             
  800. IIDLookUp(IID_IConnectionPointContainer,            "IID_IConnectionPointContainer"),         
  801. IIDLookUp(IID_IClassFactory2,                        "IID_IClassFactory2"),                    
  802. IIDLookUp(IID_IProvideClassInfo,                    "IID_IProvideClassInfo"),                 
  803. IIDLookUp(IID_IProvideClassInfo2,                    "IID_IProvideClassInfo2"),                
  804. IIDLookUp(IID_IOleControl,                            "IID_IOleControl"),                       
  805. IIDLookUp(IID_IOleControlSite,                        "IID_IOleControlSite"),                   
  806. IIDLookUp(IID_IPropertyPage,                        "IID_IPropertyPage"),                     
  807. IIDLookUp(IID_IPropertyPage2,                        "IID_IPropertyPage2"),                    
  808. IIDLookUp(IID_IPropertyPageSite,                    "IID_IPropertyPageSite"),                 
  809. IIDLookUp(IID_IPropertyNotifySink,                    "IID_IPropertyNotifySink"),               
  810. IIDLookUp(IID_ISpecifyPropertyPages,                "IID_ISpecifyPropertyPages"),             
  811. IIDLookUp(IID_IPersistMemory,                        "IID_IPersistMemory"),                    
  812. IIDLookUp(IID_IPersistStreamInit,                    "IID_IPersistStreamInit"),                
  813. IIDLookUp(IID_IPersistPropertyBag,                    "IID_IPersistPropertyBag"),               
  814. IIDLookUp(IID_ISimpleFrameSite,                        "IID_ISimpleFrameSite"),                  
  815. IIDLookUp(IID_IFont,                                "IID_IFont"),                             
  816. IIDLookUp(IID_IPicture,                                "IID_IPicture"),                          
  817. IIDLookUp(IID_IFontDisp,                            "IID_IFontDisp"),                         
  818. IIDLookUp(IID_IPictureDisp,                            "IID_IPictureDisp"),                      
  819. IIDLookUp(IID_IAdviseSinkEx,                        "IID_IAdviseSinkEx"),                     
  820. IIDLookUp(IID_IOleInPlaceObjectWindowless,            "IID_IOleInPlaceObjectWindowless"),       
  821. IIDLookUp(IID_IOleInPlaceSiteEx,                    "IID_IOleInPlaceSiteEx"),                 
  822. IIDLookUp(IID_IOleInPlaceSiteWindowless,            "IID_IOleInPlaceSiteWindowless"),         
  823. IIDLookUp(IID_IViewObjectEx,                        "IID_IViewObjectEx"),                     
  824. IIDLookUp(IID_IOleUndoUnit,                            "IID_IOleUndoUnit"),                      
  825. IIDLookUp(IID_IOleParentUndoUnit,                    "IID_IOleParentUndoUnit"),                
  826. IIDLookUp(IID_IEnumOleUndoUnits,                    "IID_IEnumOleUndoUnits"),                 
  827. IIDLookUp(IID_IOleUndoManager,                        "IID_IOleUndoManager"),                   
  828. IIDLookUp(IID_IQuickActivate,                        "IID_IQuickActivate"),                    
  829. IIDLookUp(IID_IPointerInactive,                        "IID_IPointerInactive"),                  
  830. IIDLookUp(IID_IObjectWithSite,                        "IID_IObjectWithSite"),                   
  831. IIDLookUp(IID_IErrorLog,                            "IID_IErrorLog"),                         
  832. IIDLookUp(IID_IPropertyBag,                            "IID_IPropertyBag"),                      
  833. IIDLookUp(IID_IPerPropertyBrowsing,                    "IID_IPerPropertyBrowsing"),              
  834. IIDLookUp(IID_StdOle,                                "IID_StdOle"),                            
  835. IIDLookUp(IID_IOleAdviseHolder,                        "IID_IOleAdviseHolder"),                  
  836. IIDLookUp(IID_IOleCache,                            "IID_IOleCache"),                         
  837. IIDLookUp(IID_IOleCache2,                            "IID_IOleCache2"),                        
  838. IIDLookUp(IID_IOleCacheControl,                        "IID_IOleCacheControl"),                  
  839. IIDLookUp(IID_IParseDisplayName,                    "IID_IParseDisplayName"),                 
  840. IIDLookUp(IID_IOleContainer,                        "IID_IOleContainer"),                     
  841. IIDLookUp(IID_IOleClientSite,                        "IID_IOleClientSite"),                    
  842. IIDLookUp(IID_IOleObject,                            "IID_IOleObject"),                        
  843. IIDLookUp(IID_IOleWindow,                            "IID_IOleWindow"),                        
  844. IIDLookUp(IID_IOleLink,                                "IID_IOleLink"),                          
  845. IIDLookUp(IID_IOleItemContainer,                    "IID_IOleItemContainer"),                 
  846. IIDLookUp(IID_IOleInPlaceUIWindow,                    "IID_IOleInPlaceUIWindow"),               
  847. IIDLookUp(IID_IOleInPlaceActiveObject,                "IID_IOleInPlaceActiveObject"),           
  848. IIDLookUp(IID_IOleInPlaceFrame,                        "IID_IOleInPlaceFrame"),                  
  849. IIDLookUp(IID_IOleInPlaceObject,                    "IID_IOleInPlaceObject"),                 
  850. IIDLookUp(IID_IOleInPlaceSite,                        "IID_IOleInPlaceSite"),                   
  851. IIDLookUp(IID_IContinue,                            "IID_IContinue"),                         
  852. IIDLookUp(IID_IViewObject,                            "IID_IViewObject"),                       
  853. IIDLookUp(IID_IViewObject2,                            "IID_IViewObject2"),                      
  854. IIDLookUp(IID_IDropSource,                            "IID_IDropSource"),                       
  855. IIDLookUp(IID_IDropTarget,                            "IID_IDropTarget"),                       
  856. IIDLookUp(IID_IEnumOLEVERB,                            "IID_IEnumOLEVERB"),                      
  857. IIDLookUp(IID_IServiceProvider,                        "IID_IServiceProvider"),                  
  858. IIDLookUp(IID_IUnknown,                                "IID_IUnknown"),                          
  859. IIDLookUp(IID_IClassFactory,                        "IID_IClassFactory"),                     
  860. IIDLookUp(IID_IAsyncMoniker,                           "IID_IAsyncMoniker"),                     
  861. IIDLookUp(CLSID_StdURLMoniker,                         "CLSID_StdURLMoniker"),                   
  862. IIDLookUp(CLSID_HttpProtocol,                       "CLSID_HttpProtocol"),                    
  863. IIDLookUp(CLSID_FtpProtocol,                        "CLSID_FtpProtocol"),                     
  864. IIDLookUp(CLSID_GopherProtocol,                     "CLSID_GopherProtocol"),                  
  865. IIDLookUp(CLSID_HttpSProtocol,                      "CLSID_HttpSProtocol"),                   
  866. IIDLookUp(CLSID_FileProtocol,                       "CLSID_FileProtocol"),                    
  867. IIDLookUp(CLSID_MkProtocol,                         "CLSID_MkProtocol"),                      
  868. IIDLookUp(IID_IPersistMoniker,                        "IID_IPersistMoniker"),                   
  869. IIDLookUp(IID_IBindProtocol,                        "IID_IBindProtocol"),                     
  870. IIDLookUp(IID_IBinding,                                "IID_IBinding"),                          
  871. IIDLookUp(IID_IBindStatusCallback,                    "IID_IBindStatusCallback"),               
  872. IIDLookUp(IID_IAuthenticate,                        "IID_IAuthenticate"),                     
  873. IIDLookUp(IID_IHttpNegotiate,                        "IID_IHttpNegotiate"),                    
  874. IIDLookUp(IID_IWindowForBindingUI,                    "IID_IWindowForBindingUI"),               
  875. IIDLookUp(IID_ICodeInstall,                            "IID_ICodeInstall"),                      
  876. IIDLookUp(IID_IWinInetInfo,                            "IID_IWinInetInfo"),                      
  877. IIDLookUp(IID_IHttpSecurity,                        "IID_IHttpSecurity"),                     
  878. IIDLookUp(IID_IWinInetHttpInfo,                        "IID_IWinInetHttpInfo"),                  
  879. IIDLookUp(IID_IBindHost,                            "IID_IBindHost"),
  880. IIDLookUp(IID_IUnknown,                                "IID_IUnknown"),
  881.  
  882. // ADSI stuff
  883. IIDLookUp(IID_IADs,                                    "IID_IADs"),
  884. IIDLookUp(IID_IADsContainer,                        "IID_IADsContainer"),
  885. IIDLookUp(IID_IADsCollection,                        "IID_IADsCollection"),
  886. IIDLookUp(IID_IADsMembers,                            "IID_IADsMembers"),
  887. IIDLookUp(IID_IADsPropertyList,                        "IID_IADsPropertyList"),
  888. IIDLookUp(IID_IADsPropertyEntry,                    "IID_IADsPropertyEntry"),
  889. IIDLookUp(IID_IADsPropertyValue,                    "IID_IADsPropertyValue"),
  890. IIDLookUp(IID_IADsPropertyValue2,                    "IID_IADsPropertyValue2"),
  891. IIDLookUp(IID_IPrivateDispatch,                        "IID_IPrivateDispatch"),
  892. IIDLookUp(IID_IPrivateUnknown,                        "IID_IPrivateUnknown"),
  893. IIDLookUp(IID_IADsExtension,                        "IID_IADsExtension"),
  894. IIDLookUp(IID_IADsDeleteOps,                        "IID_IADsDeleteOps"),
  895. IIDLookUp(IID_IADsNamespaces,                        "IID_IADsNamespaces"),
  896. IIDLookUp(IID_IADsClass,                            "IID_IADsClass"),
  897. IIDLookUp(IID_IADsProperty,                            "IID_IADsProperty"),
  898. IIDLookUp(IID_IADsSyntax,                            "IID_IADsSyntax"),
  899. IIDLookUp(IID_IADsLocality,                            "IID_IADsLocality"),
  900. IIDLookUp(IID_IADsO,                                "IID_IADsO"),
  901. IIDLookUp(IID_IADsOU,                                "IID_IADsOU"),
  902. IIDLookUp(IID_IADsDomain,                            "IID_IADsDomain"),
  903. IIDLookUp(IID_IADsComputer,                            "IID_IADsComputer"),
  904. IIDLookUp(IID_IADsComputerOperations,                "IID_IADsComputerOperations"),
  905. IIDLookUp(IID_IADsGroup,                            "IID_IADsGroup"),
  906. IIDLookUp(IID_IADsUser,                                "IID_IADsUser"),
  907. IIDLookUp(IID_IADsPrintQueue,                        "IID_IADsPrintQueue"),
  908. IIDLookUp(IID_IADsPrintQueueOperations,                "IID_IADsPrintQueueOperations"),
  909. IIDLookUp(IID_IADsPrintJob,                            "IID_IADsPrintJob"),
  910. IIDLookUp(IID_IADsPrintJobOperations,                "IID_IADsPrintJobOperations"),
  911. IIDLookUp(IID_IADsService,                            "IID_IADsService"),
  912. IIDLookUp(IID_IADsServiceOperations,                "IID_IADsServiceOperations"),
  913. IIDLookUp(IID_IADsFileService,                        "IID_IADsFileService"),
  914. IIDLookUp(IID_IADsFileServiceOperations,            "IID_IADsFileServiceOperations"),
  915. IIDLookUp(IID_IADsFileShare,                        "IID_IADsFileShare"),
  916. IIDLookUp(IID_IADsSession,                            "IID_IADsSession"),
  917. IIDLookUp(IID_IADsResource,                            "IID_IADsResource"),
  918. IIDLookUp(IID_IADsOpenDSObject,                        "IID_IADsOpenDSObject"),
  919. IIDLookUp(IID_IDirectoryObject,                        "IID_IDirectoryObject"),
  920. IIDLookUp(IID_IDirectorySearch,                        "IID_IDirectorySearch"),
  921. IIDLookUp(IID_IDirectoryAttrMgmt,                    "IID_IDirectoryAttrMgmt"),
  922. IIDLookUp(IID_IADsAccessControlEntry,                "IID_IADsAccessControlEntry"),
  923. IIDLookUp(IID_IADsAccessControlList,                "IID_IADsAccessControlList"),
  924. IIDLookUp(IID_IADsSecurityDescriptor,                "IID_IADsSecurityDescriptor"),
  925. IIDLookUp(IID_IADsLargeInteger,                        "IID_IADsLargeInteger"),
  926. IIDLookUp(IID_IADsNameTranslate,                    "IID_IADsNameTranslate"),
  927. IIDLookUp(IID_IADsCaseIgnoreList,                    "IID_IADsCaseIgnoreList"),
  928. IIDLookUp(IID_IADsFaxNumber,                        "IID_IADsFaxNumber"),
  929. IIDLookUp(IID_IADsNetAddress,                        "IID_IADsNetAddress"),
  930. IIDLookUp(IID_IADsOctetList,                        "IID_IADsOctetList"),
  931. IIDLookUp(IID_IADsEmail,                            "IID_IADsEmail"),
  932. IIDLookUp(IID_IADsPath,                                "IID_IADsPath"),
  933. IIDLookUp(IID_IADsReplicaPointer,                    "IID_IADsReplicaPointer"),
  934. IIDLookUp(IID_IADsAcl,                                "IID_IADsAcl"),
  935. IIDLookUp(IID_IADsTimestamp,                        "IID_IADsTimestamp"),
  936. IIDLookUp(IID_IADsPostalAddress,                    "IID_IADsPostalAddress"),
  937. IIDLookUp(IID_IADsBackLink,                            "IID_IADsBackLink"),
  938. IIDLookUp(IID_IADsTypedName,                        "IID_IADsTypedName"),
  939. IIDLookUp(IID_IADsHold,                                "IID_IADsHold"),
  940. IIDLookUp(IID_IADsObjectOptions,                    "IID_IADsObjectOptions"),
  941.  
  942. // Last ONE
  943. IIDLookUp(IID_IUnknown,NULL)
  944. };
  945.  
  946.  
  947. // Returns a string descriing the passed GUID
  948. char * GetCharFromGUID(GUID idtofind)
  949. {
  950.     int x =0;
  951.  
  952.     while(arIDs[x].pIDName && !InlineIsEqualGUID(arIDs[x].id ,idtofind))
  953.         x++;
  954.  
  955.     return arIDs[x].pIDName ;
  956. }
  957.  
  958. char pQueryAllInterfacesOut[5000];
  959.  
  960. // Queries ALL the interfaces of passed in IUNknown
  961. // returns a string with a space delimited list of the
  962. // interfaces
  963. const char * QueryAllInterfaces(IUnknown * pUnk)
  964. {
  965.  
  966.     int x = 0;
  967.     int iLen = sizeof(arIDs)/sizeof(IIDLookUp);
  968.     pQueryAllInterfacesOut[0] = NULL;
  969.     IUnknown * pGetUnk = NULL;
  970.  
  971.     for (x = 0; x < iLen; x++)
  972.     {
  973.         if(SUCCEEDED(pUnk->QueryInterface(arIDs[x].id,(void **) &pGetUnk)))
  974.         {
  975.             if (arIDs[x].pIDName)
  976.             {
  977.                 strcat (pQueryAllInterfacesOut,arIDs[x].pIDName );
  978.                 strcat (pQueryAllInterfacesOut,"\n ");
  979.                 pGetUnk->Release();
  980.                 pGetUnk = NULL;
  981.             }        
  982.         }    
  983.     }
  984.     return pQueryAllInterfacesOut;
  985. }
  986.  
  987. // Prints a Variant
  988.  
  989. HRESULT SafeArrayPrint( VARIANT & varOut) 
  990. {
  991.     HRESULT hr = S_OK;
  992.     long start, end;
  993.  
  994.     // If the Variant is NOT an Array
  995.     if ( !(V_VT(&varOut) &  VT_ARRAY)  )
  996.     {
  997.         // If the Variant is NOT a BSTR- Change it to one..                
  998.         if ( V_VT(&varOut) != VT_BSTR )
  999.         {
  1000.             hr = VariantChangeType( &varOut, &varOut,0, VT_BSTR );
  1001.  
  1002.             if( FAILED(hr) )
  1003.             {
  1004.                 return hr;
  1005.             }
  1006.  
  1007.         }
  1008.         _putws((LPOLESTR)(V_BSTR(&varOut)));
  1009.         return hr;
  1010.     }
  1011.  
  1012.     // Since the Variant is an array - get a pointer to the SafeArray with in it
  1013.     SAFEARRAY *saAttributes = V_ARRAY( &varOut);
  1014.  
  1015.     // Array dimensions
  1016.     hr = SafeArrayGetLBound( saAttributes, 1, &start );
  1017.         if( FAILED(hr) )
  1018.                 return hr;
  1019.  
  1020.     hr = SafeArrayGetUBound( saAttributes, 1, &end );
  1021.         if( FAILED(hr) )
  1022.                 return hr;
  1023.  
  1024.     VARIANT varTemp;
  1025.     VariantInit( &varTemp );
  1026.  
  1027.     // Iterate throuhgh the SafeArray
  1028.     for ( long idx = start; idx <= end; idx++   ) 
  1029.     {
  1030.  
  1031.         hr = SafeArrayGetElement( saAttributes, &idx, &varTemp);
  1032.         printf( "Elememnt STYLE (%s) ",GetVariantStyle(V_VT(&varTemp)));
  1033.  
  1034.         if( FAILED(hr) )
  1035.         {
  1036.             return hr;
  1037.         }
  1038.  
  1039.         if (HAS_BIT_STYLE(V_VT(&varTemp),VT_DISPATCH)&& !HAS_BIT_STYLE(V_VT(&varTemp),VT_NULL))
  1040.         {
  1041.             printf("[DISPATCH Variant]");
  1042.             IUnknown * pUnk = NULL;
  1043.             IDispatch * pDisp = V_DISPATCH(&varTemp);
  1044.  
  1045.             if (SUCCEEDED(pDisp->QueryInterface(IID_IUnknown,(void**) &pUnk)))
  1046.             {
  1047.                 printf("[%s]\n",QueryAllInterfaces(pUnk));
  1048.                 pUnk->Release();
  1049.                 pUnk = NULL;
  1050.             }
  1051.  
  1052.         }
  1053.         else if ( V_VT(&varTemp) != VT_BSTR )
  1054.         {
  1055.                 hr = VariantChangeType( &varTemp, &varTemp,0, VT_BSTR );
  1056.  
  1057.         }
  1058.  
  1059.         if ( !HAS_BIT_STYLE(V_VT(&varTemp),VT_BSTR) && !HAS_BIT_STYLE(V_VT(&varTemp),VT_DISPATCH))
  1060.             puts("[Unable to convert to BSTR]");
  1061.         else
  1062.             _putws((LPOLESTR)(V_BSTR(&varTemp)));
  1063.         VariantClear( &varTemp );
  1064.     }
  1065.  
  1066.     return S_OK;
  1067.