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

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { Active Directory Property Pages 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: adsprop.h, released June 2000. The original Pascal     }
  9. { code is: AdsProp.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 JwaAdsProp;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "adsprop.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   ActiveX {TODO}, JwaAdsTLB, JwaWinUser, JwaWinType;
  52. //  Windows NT Active Directory Service Property Pages
  53. //
  54. //  Contents:   Functions and definitions used in the creation of AD property
  55. //              sheets.
  56. const
  57.   WM_ADSPROP_NOTIFY_PAGEINIT   = (WM_USER + 1101); // where LPARAM is the PADSPROPINITPARAMS pointer.
  58.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_PAGEINIT}
  59.   WM_ADSPROP_NOTIFY_PAGEHWND   = (WM_USER + 1102); // where WPARAM => page's HWND and LPARAM => page's Title
  60.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_PAGEHWND}
  61.   WM_ADSPROP_NOTIFY_CHANGE     = (WM_USER + 1103); // used to send a change notification to a parent sheet
  62.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_CHANGE}
  63.   WM_ADSPROP_NOTIFY_APPLY      = (WM_USER + 1104); // pages send this to the notification object.
  64.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_APPLY}
  65.   WM_ADSPROP_NOTIFY_SETFOCUS   = (WM_USER + 1105); // used internally by the notification object.
  66.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_SETFOCUS}
  67.   WM_ADSPROP_NOTIFY_FOREGROUND = (WM_USER + 1106); // used internally by the notification object.
  68.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_FOREGROUND}
  69.   WM_ADSPROP_NOTIFY_EXIT       = (WM_USER + 1107); // sent on page release
  70.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_EXIT}
  71.   WM_ADSPROP_NOTIFY_ERROR      = (WM_USER + 1110); // used to send the notification object an error message
  72.   {$EXTERNALSYM WM_ADSPROP_NOTIFY_ERROR}
  73.   
  74. //+----------------------------------------------------------------------------
  75. //
  76. //  Structure:  ADSPROPINITPARAMS
  77. //
  78. //  Usage:      Used to pass page initialization information to new pages from
  79. //              the notify object.
  80. //
  81. //-----------------------------------------------------------------------------
  82. type
  83.   // imports of a type library sometimes are missing a few decls, these are just
  84.   // a few of them to make this file compile at all. I really should do all of
  85.   // them one day. TODO
  86.   PADSVALUE = ^_adsvalue;
  87.   {$EXTERNALSYM PADSVALUE}
  88.   PADS_ATTR_INFO = ^_ads_attr_info;
  89.   {$EXTERNALSYM PADS_ATTR_INFO}
  90.   PADSPROPINITPARAMS = ^ADSPROPINITPARAMS;
  91.   {$EXTERNALSYM PADSPROPINITPARAMS}
  92.   _ADSPROPINITPARAMS = record
  93.     dwSize: DWORD;            // Set this to the size of the struct.
  94.     dwFlags: DWORD;           // Reserved for future use.
  95.     hr: HRESULT;              // If this is non-zero, then the others
  96.     pDsObj: IDirectoryObject; // should be ignored.
  97.     pwzCN: LPWSTR;
  98.     pWritableAttrs: PADS_ATTR_INFO;
  99.   end;
  100.   {$EXTERNALSYM _ADSPROPINITPARAMS}
  101.   ADSPROPINITPARAMS = _ADSPROPINITPARAMS;
  102.   {$EXTERNALSYM ADSPROPINITPARAMS}
  103.   TAdsPropInitParams = ADSPROPINITPARAMS;
  104. //+----------------------------------------------------------------------------
  105. //
  106. //  Structure:  ADSPROPERROR
  107. //
  108. //  Usage:      Used to pass page error information to the notify object
  109. //
  110. //-----------------------------------------------------------------------------
  111.   _ADSPROPERROR = record
  112.     hwndPage: HWND;         // The HWND of the page that had the error
  113.     pszPageTitle: PWSTR;    // The title of the page that had the error
  114.     pszObjPath: PWSTR;      // Path to the object that the error occurred on
  115.     pszObjClass: PWSTR;     // Class of the object that the error occurred on    
  116.     hr: HRESULT;            // If this is non-zero, then the others
  117.                             // pszError will be ignored
  118.     pszError: PWSTR;        // An error message.  Used only if hr is zero
  119.   end;
  120.   {$EXTERNALSYM _ADSPROPERROR}
  121.   ADSPROPERROR = _ADSPROPERROR;
  122.   {$EXTERNALSYM ADSPROPERROR}
  123.   PADSPROPERROR = ^ADSPROPERROR;
  124.   {$EXTERNALSYM PADSPROPERROR}
  125.   TAdsPropError = ADSPROPERROR;
  126. //+----------------------------------------------------------------------------
  127. //
  128. //  Function:   ADsPropCreateNotifyObj
  129. //
  130. //  Synopsis:   Checks to see if the notification window/object exists for this
  131. //              sheet instance and if not creates it.
  132. //
  133. //  Arguments:  [pAppThdDataObj] - the unmarshalled data object pointer.
  134. //              [pwzADsObjName]  - object path name.
  135. //              [phNotifyObj]    - to return the notificion window handle.
  136. //
  137. //  Returns:    HRESULTs.
  138. //
  139. //-----------------------------------------------------------------------------
  140. function ADsPropCreateNotifyObj(pAppThdDataObj: Pointer{LPDATAOBJECT};
  141.   pwzADsObjName: PWSTR; var phNotifyObj: HWND): HRESULT; stdcall;
  142. {$EXTERNALSYM ADsPropCreateNotifyObj}
  143. //+----------------------------------------------------------------------------
  144. //
  145. //  Function:   ADsPropGetInitInfo
  146. //
  147. //  Synopsis:   Pages call this at their init time to retreive DS object info.
  148. //
  149. //  Arguments:  [hNotifyObj]  - the notificion window handle.
  150. //              [pInitParams] - struct filled in with DS object info. This
  151. //                              struct must be allocated by the caller before
  152. //                              the call.
  153. //
  154. //  Returns:    FALSE if the notify window has gone away for some reason or
  155. //              if the parameters are invalid.
  156. //
  157. //  Notes:      This call results in the sending of the
  158. //              WM_ADSPROP_NOTIFY_PAGEINIT message to the notify window.
  159. //              pInitParams->pWritableAttrs can be NULL if there are no
  160. //              writable attributes.
  161. //
  162. //-----------------------------------------------------------------------------
  163. function ADsPropGetInitInfo(hNotifyObj: HWND; pInitParams: PADSPROPINITPARAMS): BOOL; stdcall;
  164. {$EXTERNALSYM ADsPropGetInitInfo}
  165. //+----------------------------------------------------------------------------
  166. //
  167. //  Function:   ADsPropSetHwndWithTitle
  168. //
  169. //  Synopsis:   Pages call this at their dialog init time to send their hwnd
  170. //              to the Notify object.
  171. //
  172. //  Arguments:  [hNotifyObj]  - the notificion window handle.
  173. //              [hPage]       - the page's window handle.
  174. //              [ptzTitle]    - the page's title
  175. //
  176. //  Returns:    FALSE if the notify window has gone away for some reason.
  177. //
  178. //  Notes:      Sends the WM_ADSPROP_NOTIFY_PAGEHWND message to the notify
  179. //              window. Use this function instead of ADsPropSetHwnd for
  180. //              multi-select property pages
  181. //
  182. //-----------------------------------------------------------------------------
  183. function ADsPropSetHwndWithTitle(hNotifyObj, hPage: HWND; ptzTitle: PTSTR): BOOL; stdcall;
  184. {$EXTERNALSYM ADsPropSetHwndWithTitle}
  185. //+----------------------------------------------------------------------------
  186. //
  187. //  Function:   ADsPropSetHwnd
  188. //
  189. //  Synopsis:   Pages call this at their dialog init time to send their hwnd
  190. //              to the Notify object.
  191. //
  192. //  Arguments:  [hNotifyObj]  - the notificion window handle.
  193. //              [hPage]       - the page's window handle.
  194. //              [ptzTitle]    - the page's title
  195. //
  196. //  Returns:    FALSE if the notify window has gone away for some reason.
  197. //
  198. //  Notes:      Sends the WM_ADSPROP_NOTIFY_PAGEHWND message to the notify
  199. //              window.
  200. //
  201. //-----------------------------------------------------------------------------
  202. function ADsPropSetHwnd(hNotifyObj: HWND; hPage: HWND): BOOL; stdcall;
  203. {$EXTERNALSYM ADsPropSetHwnd}
  204. //+----------------------------------------------------------------------------
  205. //
  206. //  function:   ADsPropCheckIfWritable
  207. //
  208. //  Synopsis:   See if the attribute is writable by checking if it is in
  209. //              the allowedAttributesEffective array.
  210. //
  211. //  Arguments:  [pwzAttr]        - the attribute name.
  212. //              [pWritableAttrs] - the array of writable attributes.
  213. //
  214. //  Returns:    FALSE if the attribute name is not found in the writable-attrs
  215. //              array or if the array pointer is NULL.
  216. //
  217. //-----------------------------------------------------------------------------
  218. function ADsPropCheckIfWritable(pwzAttr: PWSTR; pWritableAttrs: PADS_ATTR_INFO): BOOL; stdcall;
  219. {$EXTERNALSYM ADsPropCheckIfWritable}
  220. //+----------------------------------------------------------------------------
  221. //
  222. //  function:   ADsPropSendErrorMessage
  223. //
  224. //  Synopsis:   Adds an error message to a list which is presented when
  225. //              ADsPropShowErrorDialog is called
  226. //
  227. //  Arguments:  [hNotifyObj]  - the notificion window handle.
  228. //              [pError]      - the error structure
  229. //
  230. //  Returns:    FALSE if the notify window has gone away for some reason.
  231. //
  232. //-----------------------------------------------------------------------------
  233. function ADsPropSendErrorMessage(hNotifyObj: HWND; pError: PADSPROPERROR): BOOL; stdcall;
  234. {$EXTERNALSYM ADsPropSendErrorMessage}
  235. //+----------------------------------------------------------------------------
  236. //
  237. //  function:   ADsPropShowErrorDialog
  238. //
  239. //  Synopsis:   Presents an error dialog with the error messages accumulated
  240. //              through calls to ADsPropSendErrorMessage
  241. //
  242. //  Arguments:  [hNotifyObj]  - the notificion window handle.
  243. //              [hPage]       - the property page window handle.
  244. //
  245. //  Returns:    FALSE if the notify window has gone away for some reason.
  246. //
  247. //-----------------------------------------------------------------------------
  248. function ADsPropShowErrorDialog(hNotifyObj: HWND; hPage: HWND): BOOL; stdcall;
  249. {$EXTERNALSYM ADsPropShowErrorDialog}
  250. implementation
  251. const
  252.   dsprop = 'dsprop.dll';
  253. {$IFDEF DYNAMIC_LINK}
  254. var
  255.   _ADsPropCreateNotifyObj: Pointer;
  256. function ADsPropCreateNotifyObj;
  257. begin
  258.   GetProcedureAddress(_ADsPropCreateNotifyObj, dsprop, 'ADsPropCreateNotifyObj');
  259.   asm
  260.     mov esp, ebp
  261.     pop ebp
  262.     jmp [_ADsPropCreateNotifyObj]
  263.   end;
  264. end;
  265. {$ELSE}
  266. function ADsPropCreateNotifyObj; external dsprop name 'ADsPropCreateNotifyObj';
  267. {$ENDIF DYNAMIC_LINK}
  268. {$IFDEF DYNAMIC_LINK}
  269. var
  270.   _ADsPropGetInitInfo: Pointer;
  271. function ADsPropGetInitInfo;
  272. begin
  273.   GetProcedureAddress(_ADsPropGetInitInfo, dsprop, 'ADsPropGetInitInfo');
  274.   asm
  275.     mov esp, ebp
  276.     pop ebp
  277.     jmp [_ADsPropGetInitInfo]
  278.   end;
  279. end;
  280. {$ELSE}
  281. function ADsPropGetInitInfo; external dsprop name 'ADsPropGetInitInfo';
  282. {$ENDIF DYNAMIC_LINK}
  283. {$IFDEF DYNAMIC_LINK}
  284. var
  285.   _ADsPropSetHwndWithTitle: Pointer;
  286. function ADsPropSetHwndWithTitle;
  287. begin
  288.   GetProcedureAddress(_ADsPropSetHwndWithTitle, dsprop, 'ADsPropSetHwndWithTitle');
  289.   asm
  290.     mov esp, ebp
  291.     pop ebp
  292.     jmp [_ADsPropSetHwndWithTitle]
  293.   end;
  294. end;
  295. {$ELSE}
  296. function ADsPropSetHwndWithTitle; external dsprop name 'ADsPropSetHwndWithTitle';
  297. {$ENDIF DYNAMIC_LINK}
  298. {$IFDEF DYNAMIC_LINK}
  299. var
  300.   _ADsPropSetHwnd: Pointer;
  301. function ADsPropSetHwnd;
  302. begin
  303.   GetProcedureAddress(_ADsPropSetHwnd, dsprop, 'ADsPropSetHwnd');
  304.   asm
  305.     mov esp, ebp
  306.     pop ebp
  307.     jmp [_ADsPropSetHwnd]
  308.   end;
  309. end;
  310. {$ELSE}
  311. function ADsPropSetHwnd; external dsprop name 'ADsPropSetHwnd';
  312. {$ENDIF DYNAMIC_LINK}
  313. {$IFDEF DYNAMIC_LINK}
  314. var
  315.   _ADsPropCheckIfWritable: Pointer;
  316. function ADsPropCheckIfWritable;
  317. begin
  318.   GetProcedureAddress(_ADsPropCheckIfWritable, dsprop, 'ADsPropCheckIfWritable');
  319.   asm
  320.     mov esp, ebp
  321.     pop ebp
  322.     jmp [_ADsPropCheckIfWritable]
  323.   end;
  324. end;
  325. {$ELSE}
  326. function ADsPropCheckIfWritable; external dsprop name 'ADsPropCheckIfWritable';
  327. {$ENDIF DYNAMIC_LINK}
  328. {$IFDEF DYNAMIC_LINK}
  329. var
  330.   _ADsPropSendErrorMessage: Pointer;
  331. function ADsPropSendErrorMessage;
  332. begin
  333.   GetProcedureAddress(_ADsPropSendErrorMessage, dsprop, 'ADsPropSendErrorMessage');
  334.   asm
  335.     mov esp, ebp
  336.     pop ebp
  337.     jmp [_ADsPropSendErrorMessage]
  338.   end;
  339. end;
  340. {$ELSE}
  341. function ADsPropSendErrorMessage; external dsprop name 'ADsPropSendErrorMessage';
  342. {$ENDIF DYNAMIC_LINK}
  343. {$IFDEF DYNAMIC_LINK}
  344. var
  345.   _ADsPropShowErrorDialog: Pointer;
  346. function ADsPropShowErrorDialog;
  347. begin
  348.   GetProcedureAddress(_ADsPropShowErrorDialog, dsprop, 'ADsPropShowErrorDialog');
  349.   asm
  350.     mov esp, ebp
  351.     pop ebp
  352.     jmp [_ADsPropShowErrorDialog]
  353.   end;
  354. end;
  355. {$ELSE}
  356. function ADsPropShowErrorDialog; external dsprop name 'ADsPropShowErrorDialog';
  357. {$ENDIF DYNAMIC_LINK}
  358. end.