JwaDSClient.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:28k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Active Directory Display API interface Unit for Object Pascal                }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: dsclient.h, released June 2000. The original Pascal    }
  9. { code is: DsClient.pas, released December 2000. The initial developer of the  }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaDSClient;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "dsclient.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaAdsTLB, JwaWinType;
  52. //---------------------------------------------------------------------------//
  53. // CLSIDs exposed for the dsclient.
  54. //---------------------------------------------------------------------------//
  55. // this CLSID is used to signal that the DSOBJECTNAMEs structure originated
  56. // for the Microsoft DS.
  57. const
  58.   CLSID_MicrosoftDS: TGUID = (
  59.     D1:$fe1290f0; D2:$cfbd; D3:$11cf; D4:($a3, $30, $0, $aa, $0, $c1, $6e, $65));
  60.   {$EXTERNALSYM CLSID_MicrosoftDS}
  61.   //CLSID_DsFolder: = CLSID_MicrosoftDS;
  62.   CLSID_DsFolder: TGUID = (
  63.     D1:$fe1290f0; D2:$cfbd; D3:$11cf; D4:($a3, $30, $0, $aa, $0, $c1, $6e, $65));
  64.   {$EXTERNALSYM CLSID_DsFolder}
  65. // this is the CLSID used by clients to get the IShellExtInit, IPropSheetExt
  66. // and IContextMenus exposed from dsuiext.dll.
  67.   CLSID_DsPropertyPages: TGUID = (
  68.     D1:$d45d530; D2:$764b; D3:$11d0; D4:($a1, $ca, $0, $aa, $0, $c1, $6e, $65));
  69.   {$EXTERNALSYM CLSID_DsPropertyPages}
  70.   CLSID_DsDomainTreeBrowser: TGUID = (
  71.     D1:$1698790a; D2:$e2b4; D3:$11d0; D4:($b0, $b1, $00, $c0, $4f, $d8, $dc, $a6));
  72.   {$EXTERNALSYM CLSID_DsDomainTreeBrowser}
  73.   IID_IDsBrowseDomainTree: TGUID = (
  74.     D1:$7cabcf1e; D2:$78f5; D3:$11d2; D4:($96, $c, $0, $c0, $4f, $a3, $1a, $86));
  75.   {$EXTERNALSYM IID_IDsBrowseDomainTree}
  76.   CLSID_DsDisplaySpecifier: TGUID = (
  77.     D1:$1ab4a8c0; D2:$6a0b; D3:$11d2; D4:($ad, $49, $0, $c0, $4f, $a3, $1a, $86));
  78.   {$EXTERNALSYM CLSID_DsDisplaySpecifier}
  79.   //IID_IDsDisplaySpecifier = CLSID_DsDisplaySpecifier;
  80.   IID_IDsDisplaySpecifier: TGUID = (
  81.     D1:$1ab4a8c0; D2:$6a0b; D3:$11d2; D4:($ad, $49, $0, $c0, $4f, $a3, $1a, $86));
  82.   {$EXTERNALSYM IID_IDsDisplaySpecifier}
  83.   CLSID_DsFolderProperties: TGUID = (
  84.     D1:$9e51e0d0; D2:$6e0f; D3:$11d2; D4:($96, $1, $0, $c0, $4f, $a3, $1a, $86));
  85.   {$EXTERNALSYM CLSID_DsFolderProperties}
  86.   //IID_IDsFolderProperties = CLSID_DsFolderProperties;
  87.   IID_IDsFolderProperties: TGUID = (
  88.     D1:$9e51e0d0; D2:$6e0f; D3:$11d2; D4:($96, $1, $0, $c0, $4f, $a3, $1a, $86));
  89.   {$EXTERNALSYM IID_IDsFolderProperties}
  90. // #include "activeds.h"
  91. //---------------------------------------------------------------------------//
  92. // Clipboard formats used within DSUI
  93. //---------------------------------------------------------------------------//
  94. //
  95. // CF_DSOBJECTS
  96. // ------------
  97. //  This clipboard format defines the seleciton for an DS IShellFolder to the
  98. //  shell extensions.   All strings are stored as BSTR's, and an offset == 0 
  99. //  is used to indicate that the string is not present.
  100. // 
  101. const
  102.   DSOBJECT_ISCONTAINER   = $00000001; // = 1 => object is a container
  103.   {$EXTERNALSYM DSOBJECT_ISCONTAINER}
  104.   DSOBJECT_READONLYPAGES = DWORD($80000000); // = 1 => read only pages
  105.   {$EXTERNALSYM DSOBJECT_READONLYPAGES}
  106.   DSPROVIDER_UNUSED_0 = $00000001;
  107.   {$EXTERNALSYM DSPROVIDER_UNUSED_0}
  108.   DSPROVIDER_UNUSED_1 = $00000002;
  109.   {$EXTERNALSYM DSPROVIDER_UNUSED_1}
  110.   DSPROVIDER_UNUSED_2 = $00000004;
  111.   {$EXTERNALSYM DSPROVIDER_UNUSED_2}
  112.   DSPROVIDER_UNUSED_3 = $00000008;
  113.   {$EXTERNALSYM DSPROVIDER_UNUSED_3}
  114.   DSPROVIDER_ADVANCED = $00000010; // = 1 => advanced mode
  115.   {$EXTERNALSYM DSPROVIDER_ADVANCED}
  116.   CFSTR_DSOBJECTNAMES = 'DsObjectNames';
  117.   {$EXTERNALSYM CFSTR_DSOBJECTNAMES}
  118. type
  119.   LPDSOBJECT = ^DSOBJECT;
  120.   {$EXTERNALSYM LPDSOBJECT}
  121.   DSOBJECT = record
  122.     dwFlags: DWORD; // item flags
  123.     dwProviderFlags: DWORD; // flags for item provider
  124.     offsetName: DWORD; // offset to ADS path of the object
  125.     offsetClass: DWORD; // offset to object class name / == 0 not known
  126.   end;
  127.   {$EXTERNALSYM DSOBJECT}
  128.   TDsObject = DSOBJECT;
  129.   PDsObject = LPDSOBJECT;
  130.   LPDSOBJECTNAMES = ^DSOBJECTNAMES;
  131.   {$EXTERNALSYM LPDSOBJECTNAMES}
  132.   DSOBJECTNAMES = record
  133.     clsidNamespace: CLSID; // namespace identifier (indicates which namespace selection from)
  134.     cItems: UINT; // number of objects
  135.     aObjects: array [0..0] of DSOBJECT; // array of objects
  136.   end;
  137.   {$EXTERNALSYM DSOBJECTNAMES}
  138.   TDsObjectNames = DSOBJECTNAMES;
  139.   PDsObjectNames = LPDSOBJECTNAMES;
  140. //
  141. // CF_DSDISPLAYSPECOPTIONS
  142. // -----------------------
  143. //  When invoking an object referenced by a display specifier (context menu, property
  144. //  page, etc) we call the IShellExtInit interface passing a IDataObject.  This data
  145. //  object supports the CF_DSDISPLAYSPECOPTIONS format to give out configuration
  146. //  informaiton about admin/shell invocation.
  147. //
  148. //  When interacting with dsuiext.dll the interfaces uses this clipboard format
  149. //  to determine which display specifier attributes to address (admin/shell)
  150. //  and pick up the values accordingly.  If no format is suppoted then
  151. //  dsuiext.dll defaults to shell.
  152. //
  153. const
  154.   CFSTR_DS_DISPLAY_SPEC_OPTIONS = 'DsDisplaySpecOptions';
  155.   {$EXTERNALSYM CFSTR_DS_DISPLAY_SPEC_OPTIONS}
  156.   CFSTR_DSDISPLAYSPECOPTIONS = CFSTR_DS_DISPLAY_SPEC_OPTIONS;
  157.   {$EXTERNALSYM CFSTR_DSDISPLAYSPECOPTIONS}
  158. type
  159.   LPDSDISPLAYSPECOPTIONS = ^DSDISPLAYSPECOPTIONS;
  160.   {$EXTERNALSYM LPDSDISPLAYSPECOPTIONS}
  161.   _DSDISPLAYSPECOPTIONS = record
  162.     dwSize: DWORD; // size of struct, for versioning
  163.     dwFlags: DWORD; // invocation flags
  164.     offsetAttribPrefix: DWORD; // offset to attribute prefix string.
  165.     offsetUserName: DWORD; // offset to UNICODE user name
  166.     offsetPassword: DWORD; // offset to UNICODE password
  167.     offsetServer: DWORD;
  168.     offsetServerConfigPath: DWORD;
  169.   end;
  170.   {$EXTERNALSYM _DSDISPLAYSPECOPTIONS}
  171.   DSDISPLAYSPECOPTIONS = _DSDISPLAYSPECOPTIONS;
  172.   {$EXTERNALSYM DSDISPLAYSPECOPTIONS}
  173.   TDsDisplaySpecOptions = DSDISPLAYSPECOPTIONS;
  174.   PDsDisplaySpecOptions = LPDSDISPLAYSPECOPTIONS;
  175. const
  176.   DS_PROP_SHELL_PREFIX = 'shell';
  177.   {$EXTERNALSYM DS_PROP_SHELL_PREFIX}
  178.   DS_PROP_ADMIN_PREFIX = 'admin';
  179.   {$EXTERNALSYM DS_PROP_ADMIN_PREFIX}
  180.   DSDSOF_HASUSERANDSERVERINFO = $00000001; // = 1 => user name/password are valid
  181.   {$EXTERNALSYM DSDSOF_HASUSERANDSERVERINFO}
  182.   DSDSOF_SIMPLEAUTHENTICATE   = $00000002; // = 1 => don't use secure authentication to DS
  183.   {$EXTERNALSYM DSDSOF_SIMPLEAUTHENTICATE}
  184.   DSDSOF_DSAVAILABLE          = $40000000; // = 1 => ignore DS available checks
  185.   {$EXTERNALSYM DSDSOF_DSAVAILABLE}
  186. //
  187. // CF_DSPROPERTYPAGEINFO
  188. // ---------------------
  189. //  When the property pages for an object are being displayed the parsed
  190. //  display specifier string is passed to the page object via the IDataObject
  191. //  in the following clipboard format.
  192. //
  193. //  Within the display specifier for a property page, the format for a
  194. //  Win32 extension is "n,{clsid}[,bla...]" we take the "bla" section and
  195. //  pass it down.
  196. // 
  197.   CFSTR_DSPROPERTYPAGEINFO = 'DsPropPageInfo';
  198.   {$EXTERNALSYM CFSTR_DSPROPERTYPAGEINFO}
  199. type
  200.   LPDSPROPERTYPAGEINFO = ^DSPROPERTYPAGEINFO;
  201.   {$EXTERNALSYM LPDSPROPERTYPAGEINFO}
  202.   DSPROPERTYPAGEINFO = record
  203.     offsetString: DWORD; // offset to UNICODE string
  204.   end;
  205.   {$EXTERNALSYM DSPROPERTYPAGEINFO}
  206.   TDsPropertyPageInfo = DSPROPERTYPAGEINFO;
  207.   PDsPropertyPageInfo = LPDSPROPERTYPAGEINFO;
  208. //
  209. // To sync property pages and the admin tools this message is broadcast
  210. //
  211. const
  212.   DSPROP_ATTRCHANGED_MSG = 'DsPropAttrChanged';
  213.   {$EXTERNALSYM DSPROP_ATTRCHANGED_MSG}
  214. //---------------------------------------------------------------------------//
  215. //---------------------------------------------------------------------------//
  216. //
  217. // IDsBrowseDomainTree
  218. // ===================
  219. //  This interface returns a list of the domains from a given computer name
  220. //  (or the current computer name if none is specified).
  221. //
  222. //  NOTES:
  223. //    1) The structure returned by ::GetDomains should be free'd using
  224. //       FreeDomains.
  225. //
  226. //    2) ::BrowseTo allocates a string on exit, this is allocated using
  227. //       CoTaskMemAlloc, and therefore should be free'd using CoTaskMemFree.
  228. //
  229. //---------------------------------------------------------------------------//
  230.   DBDTF_RETURNFQDN         = $00000001; // if not set, pszNCName will be blank
  231.   {$EXTERNALSYM DBDTF_RETURNFQDN}
  232.   DBDTF_RETURNMIXEDDOMAINS = $00000002; // set it if you want downlevel trust domains too
  233.   {$EXTERNALSYM DBDTF_RETURNMIXEDDOMAINS}
  234.   DBDTF_RETURNEXTERNAL     = $00000004; // set it if you want external trust domains too
  235.   {$EXTERNALSYM DBDTF_RETURNEXTERNAL}
  236.   DBDTF_RETURNINBOUND      = $00000008; // set it if you want trusting domains
  237.   {$EXTERNALSYM DBDTF_RETURNINBOUND}
  238.   DBDTF_RETURNINOUTBOUND   = $00000010; // set it if you want both trusted and trusting domains
  239.   {$EXTERNALSYM DBDTF_RETURNINOUTBOUND}
  240. type
  241.   PDOMAINDESC = ^DOMAINDESC;
  242.   {$EXTERNALSYM PDOMAINDESC}
  243.   _DOMAINDESC = record
  244.     pszName: LPWSTR; // domain name (if no dns, use netbios)
  245.     pszPath: LPWSTR; // set to blank
  246.     pszNCName: LPWSTR; // FQDN, e.g.,DC=mydomain,DC=microsoft,DC=com
  247.     pszTrustParent: LPWSTR; // parent domain name (if no dns, use netbios)
  248.     pszObjectClass: LPWSTR; // Object class of the domain object referenced
  249.     ulFlags: ULONG; // Flags, from DS_TRUSTED_DOMAINS.Flags
  250.     fDownLevel: BOOL; // == 1 if downlevel domain
  251.     pdChildList: PDOMAINDESC; // Children of this node
  252.     pdNextSibling: PDOMAINDESC; // Siblings of this node
  253.   end;
  254.   {$EXTERNALSYM _DOMAINDESC}
  255.   DOMAINDESC = _DOMAINDESC;
  256.   {$EXTERNALSYM DOMAINDESC}
  257.   TDomainDesc = DOMAINDESC;
  258.   PDOMAIN_TREE = ^DOMAIN_TREE;
  259.   {$EXTERNALSYM PDOMAIN_TREE}
  260.   DOMAIN_TREE = record
  261.     dsSize: DWORD;
  262.     dwCount: DWORD;
  263.     aDomains: array [0..1 - 1] of DOMAINDESC;
  264.   end;
  265.   {$EXTERNALSYM DOMAIN_TREE}
  266.   DOMAINTREE = DOMAIN_TREE;
  267.   {$EXTERNALSYM DOMAINTREE}
  268.   TDomainTree = DOMAIN_TREE;
  269.   PDomainTree = PDOMAIN_TREE;
  270.   
  271.   IDsBrowseDomainTree = interface (IUnknown)
  272.   ['{7cabcf1e-78f5-11d2-960c-00c04fa31a86}']
  273.     function BrowseTo(hwndParent: HWND; var ppszTargetPath: LPWSTR;
  274.       dwFlags: DWORD): HRESULT; stdcall;
  275.     function GetDomains(var ppDomainTree: PDOMAIN_TREE;
  276.       dwFlags: DWORD): HRESULT; stdcall;
  277.     function FreeDomains(var ppDomainTree: PDOMAIN_TREE): HRESULT; stdcall;
  278.     function FlushCachedDomains: HRESULT; stdcall;
  279.     function SetComputer(pszComputerName, pszUserName,
  280.       pszPassword: LPCWSTR): HRESULT; stdcall;
  281.   end;
  282.   {$EXTERNALSYM IDsBrowseDomainTree}
  283. //---------------------------------------------------------------------------//
  284. //---------------------------------------------------------------------------//
  285. //
  286. // IDsDisplaySpecifier
  287. // ===================
  288. //  This interface gives client UI access to the display specifiers for 
  289. //  specific attributes.
  290. //
  291. //---------------------------------------------------------------------------//
  292. //
  293. // IDsDisplaySpecifier::SetServer flags
  294. //
  295. const
  296.   DSSSF_SIMPLEAUTHENTICATE = $00000001; // = 1 => don't use secure authentication to DS
  297.   {$EXTERNALSYM DSSSF_SIMPLEAUTHENTICATE}
  298.   DSSSF_DSAVAILABLE        = DWORD($80000000); // = 1 => ignore DS available checks
  299.   {$EXTERNALSYM DSSSF_DSAVAILABLE}
  300. //
  301. // Flags for IDsDisplaySpecifier::GetIcon / GetIconLocation
  302. //
  303.   DSGIF_ISNORMAL           = $0000000; // = icon is in normal state (default)
  304.   {$EXTERNALSYM DSGIF_ISNORMAL}
  305.   DSGIF_ISOPEN             = $0000001; // = icon is in open state
  306.   {$EXTERNALSYM DSGIF_ISOPEN}
  307.   DSGIF_ISDISABLED         = $0000002; // = icon is in a disabled state
  308.   {$EXTERNALSYM DSGIF_ISDISABLED}
  309.   DSGIF_ISMASK             = $000000f;
  310.   {$EXTERNALSYM DSGIF_ISMASK}
  311.   DSGIF_GETDEFAULTICON     = $0000010; // = 1 => if no icon then get default (from shell32.dll)
  312.   {$EXTERNALSYM DSGIF_GETDEFAULTICON}
  313.   DSGIF_DEFAULTISCONTAINER = $0000020; // = 1 => if returning default icon, return it as a container
  314.   {$EXTERNALSYM DSGIF_DEFAULTISCONTAINER}
  315. //
  316. // Flags for IDsDisplaySpecifier::IsClassContainer
  317. //
  318.   DSICCF_IGNORETREATASLEAF = $00000001; // = 1 => igore the "treatAsLeaf" and use only schema information
  319.   {$EXTERNALSYM DSICCF_IGNORETREATASLEAF}
  320. //
  321. // Callback function used for IDsDisplaySpecifier::EnumClassAttributes
  322. //
  323.   DSECAF_NOTLISTED = $00000001; // = 1 => hide from the field drop down in the query UI
  324.   {$EXTERNALSYM DSECAF_NOTLISTED}
  325. type
  326.   LPDSENUMATTRIBUTES = function (lParam: LPARAM; pszAttributeName: LPCWSTR;
  327.     pszDisplayName: LPCWSTR; dwFlags: DWORD): HRESULT; stdcall;
  328.   {$EXTERNALSYM LPDSENUMATTRIBUTES}
  329.   TDsEnumAttributes = LPDSENUMATTRIBUTES;  
  330. //
  331. // IDsDisplaySpecifier::GetClassCreationInfo information
  332. //
  333. const
  334.   DSCCIF_HASWIZARDDIALOG      = $00000001; // = 1 => return the wizard dialog CLSID
  335.   {$EXTERNALSYM DSCCIF_HASWIZARDDIALOG}
  336.   DSCCIF_HASWIZARDPRIMARYPAGE = $00000002; // = 1 => returning a primary wizard dlg CLSID
  337.   {$EXTERNALSYM DSCCIF_HASWIZARDPRIMARYPAGE}
  338. type
  339.   LPDSCLASSCREATIONINFO = ^DSCLASSCREATIONINFO;
  340.   {$EXTERNALSYM LPDSCLASSCREATIONINFO}
  341.   DSCLASSCREATIONINFO = record
  342.     dwFlags: DWORD;
  343.     clsidWizardDialog: CLSID;
  344.     clsidWizardPrimaryPage: CLSID;
  345.     cWizardExtensions: DWORD; // how many extension CLSIDs?
  346.     aWizardExtensions: array [0..0] of CLSID;
  347.   end;
  348.   {$EXTERNALSYM DSCLASSCREATIONINFO}
  349.   TDsClassCreationInfo = DSCLASSCREATIONINFO;
  350.   PDsClassCreationInfo = LPDSCLASSCREATIONINFO;
  351. //
  352. // IDsDisplaySpecifier - a COM object for interacting with display specifiers
  353. //
  354.   IDsDisplaySpecifier = interface (IUnknown)
  355.   ['{1ab4a8c0-6a0b-11d2-ad49-00c04fa31a86}']
  356.     function SetServer(pszServer, pszUserName, pszPassword: LPCWSTR;
  357.       dwFlags: DWORD): HRESULT; stdcall;
  358.     function SetLanguageID(langid: LANGID): HRESULT; stdcall;
  359.     function GetDisplaySpecifier(pszObjectClass: LPCWSTR; riid: LPGUID;
  360.       var ppv: Pointer): HRESULT; stdcall;
  361.     function GetIconLocation(pszObjectClass: LPCWSTR; dwFlags: DWORD;
  362.       pszBuffer: LPWSTR; cchBuffer: Integer; var presid: Integer): HRESULT; stdcall;
  363.     function GetIcon(pszObjectClass: LPCWSTR; dwFlags: DWORD;
  364.       cxIcon, cyIcon: Integer): HICON; stdcall;
  365.     function GetFriendlyClassName(pszObjectClass: LPCWSTR; pszBuffer: LPWSTR;
  366.       cchBuffer: Integer): HRESULT; stdcall;
  367.     function GetFriendlyAttributeName(pszObjectClass, pszAttributeName,
  368.       pszBuffer: LPCWSTR; cchBuffer: UINT): HRESULT; stdcall;
  369.     function IsClassContainer(pszObjectClass, pszADsPath: LPCWSTR;
  370.       dwFlags: DWORD): BOOL; stdcall;
  371.     function GetClassCreationInfo(pszObjectClass: LPCWSTR;
  372.       var ppdscci: LPDSCLASSCREATIONINFO): HRESULT; stdcall;
  373.     function EnumClassAttributes(pszObjectClass: LPCWSTR;
  374.       pcbEnum: LPDSENUMATTRIBUTES; lParam: LPARAM): HRESULT; stdcall;
  375.     function GetAttributeADsType(pszAttributeName: LPCWSTR): ADSTYPEENUM; stdcall;
  376.   end;
  377.   {$EXTERNALSYM IDsDisplaySpecifier}
  378. //---------------------------------------------------------------------------//
  379. //
  380. // DsBrowseForContainer
  381. // --------------------
  382. //  Provides a container browser similar to the SHBrowseForFolder, except
  383. //  targetting the DS.
  384. //
  385. // In:
  386. //  pInfo -> DSBROWSEINFO structure
  387. //
  388. // Out:
  389. //  == IDOK/IDCANCEL depending on buttons, -1 if error
  390. //
  391. //---------------------------------------------------------------------------//
  392. type
  393.   BFFCALLBACK = function (hwnd: HWND; msg: UINT;
  394.     lpData, lParam: LPARAM): Integer; stdcall;
  395.   {$NODEFINE BFFCALLBACK}
  396.   TBffCallback = BFFCALLBACK;
  397.   PDSBROWSEINFOW = ^DSBROWSEINFOW;
  398.   DSBROWSEINFOW = record
  399.     cbStruct: DWORD; // size of structure in bytes
  400.     hwndOwner: HWND; // dialog owner
  401.     pszCaption: LPCWSTR; // dialog caption text (can be NULL)
  402.     pszTitle: LPCWSTR; // displayed above the tree view control (can be NULL)
  403.     pszRoot: LPCWSTR; // ADS path to root (NULL == root of DS namespace)
  404.     pszPath: LPWSTR; // [in/out] initial selection & returned path (required)
  405.     cchPath: ULONG; // size of pszPath buffer in characters
  406.     dwFlags: DWORD;
  407.     pfnCallback: BFFCALLBACK; // callback function (see SHBrowseForFolder)
  408.     lParam: LPARAM; // passed to pfnCallback as lpUserData
  409.     dwReturnFormat: DWORD; // ADS_FORMAT_* (default is ADS_FORMAT_X500_NO_SERVER)
  410.     pUserName: LPCWSTR; // Username and Password to authenticate against DS with
  411.     pPassword: LPCWSTR;
  412.     pszObjectClass: LPWSTR; // UNICODE string for the object class
  413.     cchObjectClass: ULONG;
  414.   end;
  415.   {$EXTERNALSYM DSBROWSEINFOW}
  416.   TDsBrowseInfoW = DSBROWSEINFOW;
  417.   PDSBROWSEINFOA = ^DSBROWSEINFOA;
  418.   DSBROWSEINFOA = record
  419.     cbStruct: DWORD;
  420.     hwndOwner: HWND;
  421.     pszCaption: LPCSTR;
  422.     pszTitle: LPCSTR;
  423.     pszRoot: LPCWSTR; // ADS paths are always UNICODE
  424.     pszPath: LPWSTR; // ditto
  425.     cchPath: ULONG;
  426.     dwFlags: DWORD;
  427.     pfnCallback: BFFCALLBACK;
  428.     lParam: LPARAM;
  429.     dwReturnFormat: DWORD;
  430.     pUserName: LPCWSTR; // Username and Password to authenticate against DS with
  431.     pPassword: LPCWSTR;
  432.     pszObjectClass: LPWSTR; // object class of the selected object
  433.     cchObjectClass: ULONG;
  434.   end;
  435.   {$EXTERNALSYM DSBROWSEINFOA}
  436.   TDsBrowseInfoA = DSBROWSEINFOA;
  437. {$IFDEF UNICODE}
  438.   DSBROWSEINFO = DSBROWSEINFOW;
  439.   {$EXTERNALSYM DSBROWSEINFO}
  440.   PDSBROWSEINFO = PDSBROWSEINFOW;
  441.   {$EXTERNALSYM PDSBROWSEINFO}
  442.   TDsBrowseInfo = TDsBrowseInfoW;
  443. {$ELSE}
  444.   DSBROWSEINFO = DSBROWSEINFOA;
  445.   {$EXTERNALSYM DSBROWSEINFO}
  446.   PDSBROWSEINFO = PDSBROWSEINFOA;
  447.   {$EXTERNALSYM PDSBROWSEINFO}
  448.   TDsBrowseInfo = TDsBrowseInfoA;
  449. {$ENDIF}
  450. // DSBROWSEINFO flags
  451. const
  452.   DSBI_NOBUTTONS          = $00000001; // NOT TVS_HASBUTTONS
  453.   {$EXTERNALSYM DSBI_NOBUTTONS}
  454.   DSBI_NOLINES            = $00000002; // NOT TVS_HASLINES
  455.   {$EXTERNALSYM DSBI_NOLINES}
  456.   DSBI_NOLINESATROOT      = $00000004; // NOT TVS_LINESATROOT
  457.   {$EXTERNALSYM DSBI_NOLINESATROOT}
  458.   DSBI_CHECKBOXES         = $00000100; // TVS_CHECKBOXES
  459.   {$EXTERNALSYM DSBI_CHECKBOXES}
  460.   DSBI_NOROOT             = $00010000; // don't include pszRoot in tree (its children become top level nodes)
  461.   {$EXTERNALSYM DSBI_NOROOT}
  462.   DSBI_INCLUDEHIDDEN      = $00020000; // display hidden objects
  463.   {$EXTERNALSYM DSBI_INCLUDEHIDDEN}
  464.   DSBI_EXPANDONOPEN       = $00040000; // expand to the path specified in pszPath when opening the dialog
  465.   {$EXTERNALSYM DSBI_EXPANDONOPEN}
  466.   DSBI_ENTIREDIRECTORY    = $00090000; // browse the entire directory (defaults to having DSBI_NOROOT set)
  467.   {$EXTERNALSYM DSBI_ENTIREDIRECTORY}
  468.   DSBI_RETURN_FORMAT      = $00100000; // dwReturnFormat field is valid
  469.   {$EXTERNALSYM DSBI_RETURN_FORMAT}
  470.   DSBI_HASCREDENTIALS     = $00200000; // pUserName & pPassword are valid
  471.   {$EXTERNALSYM DSBI_HASCREDENTIALS}
  472.   DSBI_IGNORETREATASLEAF  = $00400000; // ignore the treat as leaf flag when calling IsClassContainer
  473.   {$EXTERNALSYM DSBI_IGNORETREATASLEAF}
  474.   DSBI_SIMPLEAUTHENTICATE = $00800000; // don't use secure authentication to DS
  475.   {$EXTERNALSYM DSBI_SIMPLEAUTHENTICATE}
  476.   DSBI_RETURNOBJECTCLASS  = $01000000; // return object class of selected object
  477.   {$EXTERNALSYM DSBI_RETURNOBJECTCLASS}
  478.   DSB_MAX_DISPLAYNAME_CHARS = 64;
  479.   {$EXTERNALSYM DSB_MAX_DISPLAYNAME_CHARS}
  480. type
  481.   PDSBITEMW = ^DSBITEMW;
  482.   DSBITEMW = record
  483.     cbStruct: DWORD;
  484.     pszADsPath: LPCWSTR; // ADS paths are always Unicode
  485.     pszClass: LPCWSTR; // ADS properties are always Unicode
  486.     dwMask: DWORD;
  487.     dwState: DWORD;
  488.     dwStateMask: DWORD;
  489.     szDisplayName: array [0..DSB_MAX_DISPLAYNAME_CHARS - 1] of WCHAR;
  490.     szIconLocation: array [0..MAX_PATH - 1] of WCHAR;
  491.     iIconResID: Integer;
  492.   end;
  493.   {$EXTERNALSYM DSBITEMW}
  494.   TDsBItemW = DSBITEMW;
  495.   PDSBITEMA = ^DSBITEMA;
  496.   DSBITEMA = record
  497.     cbStruct: DWORD;
  498.     pszADsPath: LPCWSTR; // ADS paths are always Unicode
  499.     pszClass: LPCWSTR; // ADS properties are always Unicode
  500.     dwMask: DWORD;
  501.     dwState: DWORD;
  502.     dwStateMask: DWORD;
  503.     szDisplayName: array [0..DSB_MAX_DISPLAYNAME_CHARS - 1] of CHAR;
  504.     szIconLocation: array [0..MAX_PATH - 1] of CHAR;
  505.     iIconResID: Integer;
  506.   end;
  507.   {$EXTERNALSYM DSBITEMA}
  508.   TDsBItemA = DSBITEMA;
  509. {$IFDEF UNICODE}
  510.   DSBITEM = DSBITEMW;
  511.   {$EXTERNALSYM DSBITEM}
  512.   PDSBITEM = PDSBITEMW;
  513.   {$EXTERNALSYM PDSBITEM}
  514.   TDsBItem = TDsBItemW;
  515. {$ELSE}
  516.   DSBITEM = DSBITEMA;
  517.   {$EXTERNALSYM DSBITEM}
  518.   PDSBITEM = PDSBITEMA;
  519.   {$EXTERNALSYM PDSBITEM}
  520.   TDsBItem = TDsBItemA;
  521. {$ENDIF}
  522. // DSBITEM mask flags
  523. const
  524.   DSBF_STATE        = $00000001;
  525.   {$EXTERNALSYM DSBF_STATE}
  526.   DSBF_ICONLOCATION = $00000002;
  527.   {$EXTERNALSYM DSBF_ICONLOCATION}
  528.   DSBF_DISPLAYNAME  = $00000004;
  529.   {$EXTERNALSYM DSBF_DISPLAYNAME}
  530. // DSBITEM state flags
  531.   DSBS_CHECKED = $00000001;
  532.   {$EXTERNALSYM DSBS_CHECKED}
  533.   DSBS_HIDDEN  = $00000002;
  534.   {$EXTERNALSYM DSBS_HIDDEN}
  535.   DSBS_ROOT    = $00000004;
  536.   {$EXTERNALSYM DSBS_ROOT}
  537. //
  538. // this message is sent to the callback to see if it wants to insert or modify
  539. // the item that is about to be inserted into the view.
  540. //
  541.   DSBM_QUERYINSERTW = 100; // lParam = PDSBITEMW (state, icon & name may be modified). Return TRUE if handled.
  542.   {$EXTERNALSYM DSBM_QUERYINSERTW}
  543.   DSBM_QUERYINSERTA = 101; // lParam = PDSBITEMA (state, icon & name may be modified). Return TRUE if handled.
  544.   {$EXTERNALSYM DSBM_QUERYINSERTA}
  545. {$IFDEF UNICODE}
  546.   DSBM_QUERYINSERT = DSBM_QUERYINSERTW;
  547.   {$EXTERNALSYM DSBM_QUERYINSERT}
  548. {$ELSE}
  549.   DSBM_QUERYINSERT = DSBM_QUERYINSERTA;
  550.   {$EXTERNALSYM DSBM_QUERYINSERT}
  551. {$ENDIF}
  552. //
  553. // Called before we change the state of the icon (on tree collapse/expand)
  554. //
  555.   DSBM_CHANGEIMAGESTATE = 102; // lParam = adspath.  Return TRUE/FALSE top allow/disallow
  556.   {$EXTERNALSYM DSBM_CHANGEIMAGESTATE}
  557. //
  558. // The dialog receives a WM_HELP
  559. //
  560.   DSBM_HELP = 103; // lParam == LPHELPINFO structure
  561.   {$EXTERNALSYM DSBM_HELP}
  562. //
  563. // The dialog receives a WM_CONTEXTMENU, DSBID_xxx are the control ID's for this
  564. // dialog so that you can display suitable help.
  565. //
  566.   DSBM_CONTEXTMENU = 104; // lParam == window handle to retrieve help for
  567.   {$EXTERNALSYM DSBM_CONTEXTMENU}
  568. //
  569. // These are the control IDs for the controls in the dialog.   The callback can use
  570. // these to modify the contents of the dialog as required.
  571. //
  572.   DSBID_BANNER        = 256;
  573.   {$EXTERNALSYM DSBID_BANNER}
  574.   DSBID_CONTAINERLIST = 257;
  575.   {$EXTERNALSYM DSBID_CONTAINERLIST}
  576. //
  577. // API exported for browsing for containers.
  578. //
  579. function DsBrowseForContainerW(const pInfo: DSBROWSEINFOW): Integer; stdcall;
  580. {$EXTERNALSYM DsBrowseForContainerW}
  581. function DsBrowseForContainerA(const pInfo: DSBROWSEINFOA): Integer; stdcall;
  582. {$EXTERNALSYM DsBrowseForContainerA}
  583. {$IFDEF UNICODE}
  584. function DsBrowseForContainer(const pInfo: DSBROWSEINFOW): Integer; stdcall;
  585. {$EXTERNALSYM DsBrowseForContainer}
  586. {$ELSE}
  587. function DsBrowseForContainer(const pInfo: DSBROWSEINFOA): Integer; stdcall;
  588. {$EXTERNALSYM DsBrowseForContainer}
  589. {$ENDIF}
  590. //BUGBUG: these are here to keep old clients building - remove soon
  591. function DsGetIcon(dwFlags: DWORD; pszObjectClass: LPWSTR;
  592.   cxImage, cyImage: Integer): HICON; stdcall;
  593. {$EXTERNALSYM DsGetIcon}
  594. procedure DsGetFriendlyClassName(pszObjectClass, pszBuffer: LPWSTR;
  595.   cchBuffer: UINT); stdcall;
  596. {$EXTERNALSYM DsGetFriendlyClassName}
  597. implementation
  598. const
  599.   dsuiext = 'dsuiext.dll';
  600. {$IFDEF DYNAMIC_LINK}
  601. var
  602.   _DsBrowseForContainerW: Pointer;
  603. function DsBrowseForContainerW;
  604. begin
  605.   GetProcedureAddress(_DsBrowseForContainerW, dsuiext, 'DsBrowseForContainerW');
  606.   asm
  607.     mov esp, ebp
  608.     pop ebp
  609.     jmp [_DsBrowseForContainerW]
  610.   end;
  611. end;
  612. {$ELSE}
  613. function DsBrowseForContainerW; external dsuiext name 'DsBrowseForContainerW';
  614. {$ENDIF DYNAMIC_LINK}
  615. {$IFDEF DYNAMIC_LINK}
  616. var
  617.   _DsBrowseForContainerA: Pointer;
  618. function DsBrowseForContainerA;
  619. begin
  620.   GetProcedureAddress(_DsBrowseForContainerA, dsuiext, 'DsBrowseForContainerA');
  621.   asm
  622.     mov esp, ebp
  623.     pop ebp
  624.     jmp [_DsBrowseForContainerA]
  625.   end;
  626. end;
  627. {$ELSE}
  628. function DsBrowseForContainerA; external dsuiext name 'DsBrowseForContainerA';
  629. {$ENDIF DYNAMIC_LINK}
  630. {$IFDEF UNICODE}
  631. {$IFDEF DYNAMIC_LINK}
  632. var
  633.   _DsBrowseForContainer: Pointer;
  634. function DsBrowseForContainer;
  635. begin
  636.   GetProcedureAddress(_DsBrowseForContainer, dsuiext, 'DsBrowseForContainerW');
  637.   asm
  638.     mov esp, ebp
  639.     pop ebp
  640.     jmp [_DsBrowseForContainer]
  641.   end;
  642. end;
  643. {$ELSE}
  644. function DsBrowseForContainer; external dsuiext name 'DsBrowseForContainerW';
  645. {$ENDIF DYNAMIC_LINK}
  646. {$ELSE}
  647. {$IFDEF DYNAMIC_LINK}
  648. var
  649.   _DsBrowseForContainer: Pointer;
  650. function DsBrowseForContainer;
  651. begin
  652.   GetProcedureAddress(_DsBrowseForContainer, dsuiext, 'DsBrowseForContainerA');
  653.   asm
  654.     mov esp, ebp
  655.     pop ebp
  656.     jmp [_DsBrowseForContainer]
  657.   end;
  658. end;
  659. {$ELSE}
  660. function DsBrowseForContainer; external dsuiext name 'DsBrowseForContainerA';
  661. {$ENDIF DYNAMIC_LINK}
  662. {$ENDIF}
  663. {$IFDEF DYNAMIC_LINK}
  664. var
  665.   _DsGetIcon: Pointer;
  666. function DsGetIcon;
  667. begin
  668.   GetProcedureAddress(_DsGetIcon, dsuiext, 'DsGetIcon');
  669.   asm
  670.     mov esp, ebp
  671.     pop ebp
  672.     jmp [_DsGetIcon]
  673.   end;
  674. end;
  675. {$ELSE}
  676. function DsGetIcon; external dsuiext name 'DsGetIcon';
  677. {$ENDIF DYNAMIC_LINK}
  678. {$IFDEF DYNAMIC_LINK}
  679. var
  680.   _DsGetFriendlyClassName: Pointer;
  681. procedure DsGetFriendlyClassName;
  682. begin
  683.   GetProcedureAddress(_DsGetFriendlyClassName, dsuiext, 'DsGetFriendlyClassName');
  684.   asm
  685.     mov esp, ebp
  686.     pop ebp
  687.     jmp [_DsGetFriendlyClassName]
  688.   end;
  689. end;
  690. {$ELSE}
  691. procedure DsGetFriendlyClassName; external dsuiext name 'DsGetFriendlyClassName';
  692. {$ENDIF DYNAMIC_LINK}
  693. end.