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