WindowsAddressBook.pas 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. unit WindowsAddressBook;
  2. interface
  3. uses ExtCtrls,ComObj,WabDefs, WabApi,SysUtils,WabIab,Classes,Windows,Registry;
  4. type
  5. //定义保存联系人的数据结构
  6. PContacter=^TContacter;
  7. TContacter=Record
  8. Name:String;
  9. Sex:String;
  10. Nickname:String; //别名
  11. Birthday:String;
  12. Mobile:String;
  13. Email:String;
  14. Company:String;
  15. Tel:String;
  16. Job:String;
  17. Profession:String;//行业
  18. Country:String; //国家
  19. WorkAddr1:String;//省
  20. WorkAddr2:String;//区市
  21. WorkAddr3:String;//街道
  22. PostalCode:String;//邮政编码
  23. Remark:String;
  24. end;
  25. TWinAddressBook = class(TComponent)
  26. private
  27. AddrBook: IAddrBook;
  28. WabObject: IWabObject;
  29. FFileName : String;
  30. FContactsName : TStringList;
  31. FContactIds : TList;
  32. FContacterList:TList;
  33. function SPropValueToStr(PropValue: TSPropValue): String;
  34. function SPropValueToTypeStr(PropValue: TSPropValue):String;
  35. procedure FreeSRowSet(var P: PSRowSet);
  36. procedure FreeSBinary(var P: PSBinary);
  37. procedure LoadItems;
  38. public
  39. procedure GetPropertiesOf(name : String;iIndex:Integer);
  40. published
  41. constructor Create(aOwner : TComponent); override;
  42. destructor Destroy; override;
  43. procedure LoadFile;
  44. function Connect : boolean;
  45. procedure SetToDefaultAddressBook;
  46. property FileName : String Read FFileName Write FFileName;
  47. property ContacterList: TList Read FContacterList;
  48. end;
  49. procedure Register;
  50. implementation
  51. uses wabTags;
  52. procedure Register;
  53. begin
  54. RegisterComponents('Samples', [TWinAddressBook]);
  55. end;
  56. destructor TWinAddressBook.Destroy;
  57. begin
  58. AddrBook := nil;
  59. WabObject := nil;
  60. while(FContacterList.Count>0) do
  61. begin
  62. dispose(FContacterList.First);
  63. FContacterList.Delete(0);
  64. end;
  65. FContacterList.Free;
  66. FContactIDs.Free;
  67. FContactsName.Free;
  68. inherited Destroy;
  69. end;
  70. constructor TWinAddressBook.Create(aowner : TComponent);
  71. begin
  72. inherited create(aowner);
  73. FContacterList := TList.create;
  74. FContactIds := TList.create;
  75. FContactsName:=TStringList.Create;
  76. end;
  77. procedure TWinAddressBook.SetToDefaultAddressBook;
  78. var r : TRegistry;
  79. begin
  80. R := TRegistry.Create;
  81. FFileName := '';
  82. try
  83. R.RootKey := HKEY_CURRENT_USER;
  84. if R.OpenKey('\Software\Microsoft\Windows\WAB\WAB4',false) then
  85. FFileName := r.ReadString('Wab File Name');
  86. except
  87. end;
  88. end;
  89. function TWinAddressBook.Connect : Boolean;
  90. begin
  91. result := WabApiLoaded;
  92. end;
  93. procedure TWinAddressBook.FreeSRowSet(var P: PSRowSet);
  94. var
  95. I: Integer;
  96. begin
  97. for I := 0 to P^.cRows - 1 do
  98. OleCheck(WabObject.FreeBuffer(P^.aRow[I].lpProps));
  99. OleCheck(WabObject.FreeBuffer(P));
  100. P := nil;
  101. end;
  102. procedure TWinAddressBook.FreeSBinary(var P: PSBinary);
  103. begin
  104. if P = nil then Exit;
  105. FreeMem(P.lpb);
  106. Dispose(P);
  107. P := nil;
  108. end;
  109. procedure TWinAddressBook.GetPropertiesOf(name:String;iIndex:Integer);
  110. var FLastDetailsCount,iLoop: Integer;
  111. EntryIDData : PSBinary;
  112. FLastDetailID: PSBinary;
  113. objType : ULong;
  114. MailUser: IMailUser;
  115. FLastDetails: PSPropsArray;
  116. PTmpContacter:PContacter;
  117. procedure ClearLastDetails;
  118. begin
  119. if FLastDetails <> nil then
  120. begin
  121. OleCheck(WabObject.FreeBuffer(FLastDetails));
  122. FreeSBinary(FLastDetailID);
  123. FLastDetails := nil;
  124. FLastDetailsCount := 0;
  125. end;
  126. end;
  127. begin
  128. FLastDetails := nil;
  129. ClearLastDetails;
  130. EntryIDData := fContactIds[iIndex];
  131. if ENtryIDData = nil then exit;
  132. objType := 0;
  133. with EntryIDData^ do
  134. begin
  135. New(FLastDetailID);
  136. FLastDetailID.cb := cb;
  137. GetMem(FLastDetailID.lpb, cb);
  138. CopyMemory(FLastDetailID.lpb, lpb, cb);
  139. OleCheck(AddrBook.OpenEntry(cb, lpb, nil, 0, ObjType, IUnknown(MailUser)));
  140. end;
  141. OleCheck(MailUser.GetProps(nil, 0, @FLastDetailsCount, PSPropValue(FLastDetails)));
  142. PTmpContacter:=New(PContacter);
  143. PTmpContacter.Name:=Name;
  144. for iLoop := 0 to FLastDetailsCount-1 do
  145. begin
  146. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='GENDER' then
  147. begin
  148. if SPropValueToStr(FLastDetails[iLoop])='1' then
  149. PTmpContacter.Sex:='女'
  150. else
  151. PTmpContacter.Sex:='男';
  152. end;
  153. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='NICKNAME' then
  154. PTmpContacter.Nickname:=SPropValueToStr(FLastDetails[iLoop]);
  155. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='BIRTHDAY' then
  156. PTmpContacter.Birthday:=SPropValueToStr(FLastDetails[iLoop]);
  157. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='MOBILE_TELEPHONE_NUMBER' then
  158. PTmpContacter.Mobile:=SPropValueToStr(FLastDetails[iLoop]);
  159. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='EMAIL_ADDRESS' then
  160. PTmpContacter.Email:=SPropValueToStr(FLastDetails[iLoop]);
  161. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='COMPANY_NAME' then
  162. PTmpContacter.Company:=SPropValueToStr(FLastDetails[iLoop]);
  163. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='TITLE' then
  164. PTmpContacter.Job:=SPropValueToStr(FLastDetails[iLoop]);
  165. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='DISPLAY_NAME_PREFIX' then
  166. PTmpContacter.Profession:=SPropValueToStr(FLastDetails[iLoop]);
  167. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='COUNTRY' then
  168. PTmpContacter.Country:=SPropValueToStr(FLastDetails[iLoop]);
  169. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='STATE_OR_PROVINCE' then
  170. PTmpContacter.WorkAddr1:=SPropValueToStr(FLastDetails[iLoop]);
  171. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='LOCALITY' then
  172. PTmpContacter.WorkAddr2:=SPropValueToStr(FLastDetails[iLoop]);
  173. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='STREET_ADDRESS' then
  174. PTmpContacter.WorkAddr3:=SPropValueToStr(FLastDetails[iLoop]);
  175. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='POSTAL_CODE' then
  176. PTmpContacter.PostalCode:=SPropValueToStr(FLastDetails[iLoop]);
  177. if trim(SPropValueToTypeStr(FLastDetails[iLoop]))='COMMENT' then
  178. PTmpContacter.Remark:=SPropValueToStr(FLastDetails[iLoop]);
  179. end;
  180. FContacterList.Add(PTmpContacter);
  181. end;
  182. function TWinAddressBook.SPropValueToStr(PropValue: TSPropValue): string;
  183. var
  184. LT: TFileTime;
  185. ST: TSystemTime;
  186. begin
  187. with PropValue do
  188. case PROP_TYPE(ulPropTag) of
  189. PT_TSTRING:
  190. Result := Value.lpszA;
  191. PT_BINARY:
  192. if Value.bin.cb = 4 then
  193. Result := Format('[Binary - Size: %d bytes] (%.8x)', [Value.bin.cb, PDWORD(Value.bin.lpb)^])
  194. else
  195. Result := Format('[Binary - Size: %d bytes]', [Value.bin.cb]);
  196. PT_I2:
  197. Result := IntToStr(Value.i);
  198. PT_LONG:
  199. Result := IntToStr(Value.l);
  200. PT_R4:
  201. Result := FloatToStr(Value.flt);
  202. PT_DOUBLE:
  203. Result := FloatToStr(Value.dbl);
  204. PT_BOOLEAN:
  205. Result := IntToStr(Value.b);
  206. PT_SYSTIME:
  207. begin
  208. FileTimeToLocalFileTime(Value.ft, LT);
  209. FileTimeToSystemTime(LT, ST);
  210. Result := DateTimeToStr(SystemTimeToDateTime(ST));
  211. end;
  212. PT_ERROR:
  213. Result := '';
  214. else
  215. Result := Format('[Unknown type %x]', [PROP_TYPE(ulPropTag)]);
  216. end;
  217. end;
  218. procedure TWinAddressBook.LoadFile;
  219. var
  220. WP: TWabParam;
  221. iLoop:Integer;
  222. begin
  223. ZeroMemory(@WP, Sizeof(WP));
  224. WP.cbSize := Sizeof(WP);
  225. WP.szFileName := PChar(fFileName);
  226. WP.hwnd := 0;
  227. OleCheck(WabOpen(AddrBook, WabObject, @WP, 0));
  228. {-- Ok its loaded now get all the contacts}
  229. LoadItems;
  230. for iLoop := 0 to FContactsName.Count - 1 do
  231. begin
  232. GetPropertiesOf(FContactsName[iLoop],iLoop);
  233. end;
  234. end;
  235. procedure TWinAddressBook.LoadItems;
  236. const
  237. TableColumns: record // SizedSPropTagArray macro
  238. Count: ULONG;
  239. Definition: array[0..4] of ULONG;
  240. end = (
  241. Count: 5;
  242. Definition:
  243. (PR_DISPLAY_NAME,
  244. PR_EMAIL_ADDRESS,
  245. PR_PERSONAL_HOME_PAGE,
  246. PR_ENTRYID,
  247. PR_OBJECT_TYPE);
  248. );
  249. var
  250. Container: IABContainer;
  251. EntryID: PEntryID;
  252. EntryIDSize, ObjType: ULONG;
  253. Table: IMAPITable;
  254. TableRow: PSRowSet;
  255. EntryIDData: PSBinary;
  256. begin
  257. OleCheck(AddrBook.GetPAB(EntryIDSize, EntryID));
  258. OleCheck(AddrBook.OpenEntry(EntryIDSize, EntryID, nil, 0,
  259. ObjType, IUnknown(Container)));
  260. OleCheck(WabObject.FreeBuffer(EntryID));
  261. OleCheck(Container.GetContentsTable(0, Table));
  262. OleCheck(Table.SetColumns(@TableColumns, 0));
  263. OleCheck(Table.SeekRow(BOOKMARK_BEGINNING, 0, nil));
  264. FContactsName.clear;
  265. FContactIDs.clear;
  266. repeat
  267. OleCheck(Table.QueryRows(1, 0, TableRow));
  268. if TableRow.cRows > 0 then with TableRow^.aRow[0] do
  269. begin
  270. if ULONG(lpProps[4].Value.l) in [MAPI_MAILUSER, MAPI_DISTLIST] then
  271. begin
  272. EntryID := lpProps[3].Value.bin.lpb;
  273. EntryIDSize := lpProps[3].Value.bin.cb;
  274. OleCheck(WabObject.AllocateBuffer(Sizeof(TSBinary), Pointer(EntryIDData)));
  275. OleCheck(WabObject.AllocateMore(EntryIDSize, EntryIDData, Pointer(EntryIDData.lpb)));
  276. CopyMemory(EntryIDData.lpb, EntryID, EntryIDSize);
  277. EntryIDData^.cb := EntryIDSize;
  278. FContactIds.Add(EntryIDData);
  279. {indexes 1 and 2 have the email and web addresses}
  280. case ULONG(lpProps[4].Value.l) of
  281. MAPI_MAILUSER:
  282. FContactsName.Add(SPropValueToStr(lpProps[0]));
  283. MAPI_DISTLIST:
  284. {Ignoring lists for the moment}
  285. end;
  286. end;
  287. FreeSRowSet(TableRow);
  288. end else Break;
  289. until False;
  290. end;
  291. function TWinAddressBook.SPropValueToTypeStr(PropValue: TSPropValue): string;
  292. const
  293. TagNames: array[1..321] of record
  294. Tag: ULONG;
  295. Name: PChar
  296. end = (
  297. (Tag: PR_ENTRYID; Name: 'ENTRYID'),
  298. (Tag: PR_OBJECT_TYPE; Name: 'OBJECT_TYPE'),
  299. (Tag: PR_ICON; Name: 'ICON'),
  300. (Tag: PR_MINI_ICON; Name: 'MINI_ICON'),
  301. (Tag: PR_STORE_ENTRYID; Name: 'STORE_ENTRYID'),
  302. (Tag: PR_STORE_RECORD_KEY; Name: 'STORE_RECORD_KEY'),
  303. (Tag: PR_RECORD_KEY; Name: 'RECORD_KEY'),
  304. (Tag: PR_MAPPING_SIGNATURE; Name: 'MAPPING_SIGNATURE'),
  305. (Tag: PR_ACCESS_LEVEL; Name: 'ACCESS_LEVEL'),
  306. (Tag: PR_INSTANCE_KEY; Name: 'INSTANCE_KEY'),
  307. (Tag: PR_ROW_TYPE; Name: 'ROW_TYPE'),
  308. (Tag: PR_ACCESS; Name: 'ACCESS'),
  309. (Tag: PR_ROWID; Name: 'ROWID'),
  310. (Tag: PR_DISPLAY_NAME; Name: 'DISPLAY_NAME'),
  311. (Tag: PR_DISPLAY_NAME_W; Name: 'DISPLAY_NAME_W'),
  312. (Tag: PR_DISPLAY_NAME_A; Name: 'DISPLAY_NAME_A'),
  313. (Tag: PR_ADDRTYPE; Name: 'ADDRTYPE'),
  314. (Tag: PR_ADDRTYPE_W; Name: 'ADDRTYPE_W'),
  315. (Tag: PR_ADDRTYPE_A; Name: 'ADDRTYPE_A'),
  316. (Tag: PR_EMAIL_ADDRESS; Name: 'EMAIL_ADDRESS'),
  317. (Tag: PR_EMAIL_ADDRESS_W; Name: 'EMAIL_ADDRESS_W'),
  318. (Tag: PR_EMAIL_ADDRESS_A; Name: 'EMAIL_ADDRESS_A'),
  319. (Tag: PR_COMMENT; Name: 'COMMENT'),
  320. (Tag: PR_COMMENT_W; Name: 'COMMENT_W'),
  321. (Tag: PR_COMMENT_A; Name: 'COMMENT_A'),
  322. (Tag: PR_DEPTH; Name: 'DEPTH'),
  323. (Tag: PR_PROVIDER_DISPLAY; Name: 'PROVIDER_DISPLAY'),
  324. (Tag: PR_PROVIDER_DISPLAY_W; Name: 'PROVIDER_DISPLAY_W'),
  325. (Tag: PR_PROVIDER_DISPLAY_A; Name: 'PROVIDER_DISPLAY_A'),
  326. (Tag: PR_CREATION_TIME; Name: 'CREATION_TIME'),
  327. (Tag: PR_LAST_MODIFICATION_TIME; Name: 'LAST_MODIFICATION_TIME'),
  328. (Tag: PR_RESOURCE_FLAGS; Name: 'RESOURCE_FLAGS'),
  329. (Tag: PR_PROVIDER_DLL_NAME; Name: 'PROVIDER_DLL_NAME'),
  330. (Tag: PR_PROVIDER_DLL_NAME_W; Name: 'PROVIDER_DLL_NAME_W'),
  331. (Tag: PR_PROVIDER_DLL_NAME_A; Name: 'PROVIDER_DLL_NAME_A'),
  332. (Tag: PR_SEARCH_KEY; Name: 'SEARCH_KEY'),
  333. (Tag: PR_PROVIDER_UID; Name: 'PROVIDER_UID'),
  334. (Tag: PR_PROVIDER_ORDINAL; Name: 'PROVIDER_ORDINAL'),
  335. (Tag: PR_CONTAINER_FLAGS; Name: 'CONTAINER_FLAGS'),
  336. (Tag: PR_FOLDER_TYPE; Name: 'FOLDER_TYPE'),
  337. (Tag: PR_CONTENT_COUNT; Name: 'CONTENT_COUNT'),
  338. (Tag: PR_CONTENT_UNREAD; Name: 'CONTENT_UNREAD'),
  339. (Tag: PR_CREATE_TEMPLATES; Name: 'CREATE_TEMPLATES'),
  340. (Tag: PR_DETAILS_TABLE; Name: 'DETAILS_TABLE'),
  341. (Tag: PR_SEARCH; Name: 'SEARCH'),
  342. (Tag: PR_SELECTABLE; Name: 'SELECTABLE'),
  343. (Tag: PR_SUBFOLDERS; Name: 'SUBFOLDERS'),
  344. (Tag: PR_STATUS; Name: 'STATUS'),
  345. (Tag: PR_ANR; Name: 'ANR'),
  346. (Tag: PR_ANR_W; Name: 'ANR_W'),
  347. (Tag: PR_ANR_A; Name: 'ANR_A'),
  348. (Tag: PR_CONTENTS_SORT_ORDER; Name: 'CONTENTS_SORT_ORDER'),
  349. (Tag: PR_CONTAINER_HIERARCHY; Name: 'CONTAINER_HIERARCHY'),
  350. (Tag: PR_CONTAINER_CONTENTS; Name: 'CONTAINER_CONTENTS'),
  351. (Tag: PR_FOLDER_ASSOCIATED_CONTENTS; Name: 'FOLDER_ASSOCIATED_CONTENTS'),
  352. (Tag: PR_DEF_CREATE_DL; Name: 'DEF_CREATE_DL'),
  353. (Tag: PR_DEF_CREATE_MAILUSER; Name: 'DEF_CREATE_MAILUSER'),
  354. (Tag: PR_CONTAINER_CLASS; Name: 'CONTAINER_CLASS'),
  355. (Tag: PR_CONTAINER_CLASS_W; Name: 'CONTAINER_CLASS_W'),
  356. (Tag: PR_CONTAINER_CLASS_A; Name: 'CONTAINER_CLASS_A'),
  357. (Tag: PR_CONTAINER_MODIFY_VERSION; Name: 'CONTAINER_MODIFY_VERSION'),
  358. (Tag: PR_AB_PROVIDER_ID; Name: 'AB_PROVIDER_ID'),
  359. (Tag: PR_DEFAULT_VIEW_ENTRYID; Name: 'DEFAULT_VIEW_ENTRYID'),
  360. (Tag: PR_ASSOC_CONTENT_COUNT; Name: 'ASSOC_CONTENT_COUNT'),
  361. (Tag: PR_DISPLAY_TYPE; Name: 'DISPLAY_TYPE'),
  362. (Tag: PR_TEMPLATEID; Name: 'TEMPLATEID'),
  363. (Tag: PR_PRIMARY_CAPABILITY; Name: 'PRIMARY_CAPABILITY'),
  364. (Tag: PR_7BIT_DISPLAY_NAME; Name: '7BIT_DISPLAY_NAME'),
  365. (Tag: PR_ACCOUNT; Name: 'ACCOUNT'),
  366. (Tag: PR_ACCOUNT_W; Name: 'ACCOUNT_W'),
  367. (Tag: PR_ACCOUNT_A; Name: 'ACCOUNT_A'),
  368. (Tag: PR_ALTERNATE_RECIPIENT; Name: 'ALTERNATE_RECIPIENT'),
  369. (Tag: PR_CALLBACK_TELEPHONE_NUMBER; Name: 'CALLBACK_TELEPHONE_NUMBER'),
  370. (Tag: PR_CALLBACK_TELEPHONE_NUMBER_W; Name: 'CALLBACK_TELEPHONE_NUMBER_W'),
  371. (Tag: PR_CALLBACK_TELEPHONE_NUMBER_A; Name: 'CALLBACK_TELEPHONE_NUMBER_A'),
  372. (Tag: PR_CONVERSION_PROHIBITED; Name: 'CONVERSION_PROHIBITED'),
  373. (Tag: PR_DISCLOSE_RECIPIENTS; Name: 'DISCLOSE_RECIPIENTS'),
  374. (Tag: PR_GENERATION; Name: 'GENERATION'),
  375. (Tag: PR_GENERATION_W; Name: 'GENERATION_W'),
  376. (Tag: PR_GENERATION_A; Name: 'GENERATION_A'),
  377. (Tag: PR_GIVEN_NAME; Name: 'GIVEN_NAME'),
  378. (Tag: PR_GIVEN_NAME_W; Name: 'GIVEN_NAME_W'),
  379. (Tag: PR_GIVEN_NAME_A; Name: 'GIVEN_NAME_A'),
  380. (Tag: PR_GOVERNMENT_ID_NUMBER; Name: 'GOVERNMENT_ID_NUMBER'),
  381. (Tag: PR_GOVERNMENT_ID_NUMBER_W; Name: 'GOVERNMENT_ID_NUMBER_W'),
  382. (Tag: PR_GOVERNMENT_ID_NUMBER_A; Name: 'GOVERNMENT_ID_NUMBER_A'),
  383. (Tag: PR_BUSINESS_TELEPHONE_NUMBER; Name: 'BUSINESS_TELEPHONE_NUMBER'),
  384. (Tag: PR_BUSINESS_TELEPHONE_NUMBER_W; Name: 'BUSINESS_TELEPHONE_NUMBER_W'),
  385. (Tag: PR_BUSINESS_TELEPHONE_NUMBER_A; Name: 'BUSINESS_TELEPHONE_NUMBER_A'),
  386. (Tag: PR_OFFICE_TELEPHONE_NUMBER; Name: 'OFFICE_TELEPHONE_NUMBER'),
  387. (Tag: PR_OFFICE_TELEPHONE_NUMBER_W; Name: 'OFFICE_TELEPHONE_NUMBER_W'),
  388. (Tag: PR_OFFICE_TELEPHONE_NUMBER_A; Name: 'OFFICE_TELEPHONE_NUMBER_A'),
  389. (Tag: PR_HOME_TELEPHONE_NUMBER; Name: 'HOME_TELEPHONE_NUMBER'),
  390. (Tag: PR_HOME_TELEPHONE_NUMBER_W; Name: 'HOME_TELEPHONE_NUMBER_W'),
  391. (Tag: PR_HOME_TELEPHONE_NUMBER_A; Name: 'HOME_TELEPHONE_NUMBER_A'),
  392. (Tag: PR_INITIALS; Name: 'INITIALS'),
  393. (Tag: PR_INITIALS_W; Name: 'INITIALS_W'),
  394. (Tag: PR_INITIALS_A; Name: 'INITIALS_A'),
  395. (Tag: PR_KEYWORD; Name: 'KEYWORD'),
  396. (Tag: PR_KEYWORD_W; Name: 'KEYWORD_W'),
  397. (Tag: PR_KEYWORD_A; Name: 'KEYWORD_A'),
  398. (Tag: PR_LANGUAGE; Name: 'LANGUAGE'),
  399. (Tag: PR_LANGUAGE_W; Name: 'LANGUAGE_W'),
  400. (Tag: PR_LANGUAGE_A; Name: 'LANGUAGE_A'),
  401. (Tag: PR_LOCATION; Name: 'LOCATION'),
  402. (Tag: PR_LOCATION_W; Name: 'LOCATION_W'),
  403. (Tag: PR_LOCATION_A; Name: 'LOCATION_A'),
  404. (Tag: PR_MAIL_PERMISSION; Name: 'MAIL_PERMISSION'),
  405. (Tag: PR_MHS_COMMON_NAME; Name: 'MHS_COMMON_NAME'),
  406. (Tag: PR_MHS_COMMON_NAME_W; Name: 'MHS_COMMON_NAME_W'),
  407. (Tag: PR_MHS_COMMON_NAME_A; Name: 'MHS_COMMON_NAME_A'),
  408. (Tag: PR_ORGANIZATIONAL_ID_NUMBER; Name: 'ORGANIZATIONAL_ID_NUMBER'),
  409. (Tag: PR_ORGANIZATIONAL_ID_NUMBER_W; Name: 'ORGANIZATIONAL_ID_NUMBER_W'),
  410. (Tag: PR_ORGANIZATIONAL_ID_NUMBER_A; Name: 'ORGANIZATIONAL_ID_NUMBER_A'),
  411. (Tag: PR_SURNAME; Name: 'SURNAME'),
  412. (Tag: PR_SURNAME_W; Name: 'SURNAME_W'),
  413. (Tag: PR_SURNAME_A; Name: 'SURNAME_A'),
  414. (Tag: PR_ORIGINAL_ENTRYID; Name: 'ORIGINAL_ENTRYID'),
  415. (Tag: PR_ORIGINAL_DISPLAY_NAME; Name: 'ORIGINAL_DISPLAY_NAME'),
  416. (Tag: PR_ORIGINAL_DISPLAY_NAME_W; Name: 'ORIGINAL_DISPLAY_NAME_W'),
  417. (Tag: PR_ORIGINAL_DISPLAY_NAME_A; Name: 'ORIGINAL_DISPLAY_NAME_A'),
  418. (Tag: PR_ORIGINAL_SEARCH_KEY; Name: 'ORIGINAL_SEARCH_KEY'),
  419. (Tag: PR_POSTAL_ADDRESS; Name: 'POSTAL_ADDRESS'),
  420. (Tag: PR_POSTAL_ADDRESS_W; Name: 'POSTAL_ADDRESS_W'),
  421. (Tag: PR_POSTAL_ADDRESS_A; Name: 'POSTAL_ADDRESS_A'),
  422. (Tag: PR_COMPANY_NAME; Name: 'COMPANY_NAME'),
  423. (Tag: PR_COMPANY_NAME_W; Name: 'COMPANY_NAME_W'),
  424. (Tag: PR_COMPANY_NAME_A; Name: 'COMPANY_NAME_A'),
  425. (Tag: PR_TITLE; Name: 'TITLE'),
  426. (Tag: PR_TITLE_W; Name: 'TITLE_W'),
  427. (Tag: PR_TITLE_A; Name: 'TITLE_A'),
  428. (Tag: PR_DEPARTMENT_NAME; Name: 'DEPARTMENT_NAME'),
  429. (Tag: PR_DEPARTMENT_NAME_W; Name: 'DEPARTMENT_NAME_W'),
  430. (Tag: PR_DEPARTMENT_NAME_A; Name: 'DEPARTMENT_NAME_A'),
  431. (Tag: PR_OFFICE_LOCATION; Name: 'OFFICE_LOCATION'),
  432. (Tag: PR_OFFICE_LOCATION_W; Name: 'OFFICE_LOCATION_W'),
  433. (Tag: PR_OFFICE_LOCATION_A; Name: 'OFFICE_LOCATION_A'),
  434. (Tag: PR_PRIMARY_TELEPHONE_NUMBER; Name: 'PRIMARY_TELEPHONE_NUMBER'),
  435. (Tag: PR_PRIMARY_TELEPHONE_NUMBER_W; Name: 'PRIMARY_TELEPHONE_NUMBER_W'),
  436. (Tag: PR_PRIMARY_TELEPHONE_NUMBER_A; Name: 'PRIMARY_TELEPHONE_NUMBER_A'),
  437. (Tag: PR_BUSINESS2_TELEPHONE_NUMBER; Name: 'BUSINESS2_TELEPHONE_NUMBER'),
  438. (Tag: PR_BUSINESS2_TELEPHONE_NUMBER_W; Name: 'BUSINESS2_TELEPHONE_NUMBER_W'),
  439. (Tag: PR_BUSINESS2_TELEPHONE_NUMBER_A; Name: 'BUSINESS2_TELEPHONE_NUMBER_A'),
  440. (Tag: PR_OFFICE2_TELEPHONE_NUMBER; Name: 'OFFICE2_TELEPHONE_NUMBER'),
  441. (Tag: PR_OFFICE2_TELEPHONE_NUMBER_W; Name: 'OFFICE2_TELEPHONE_NUMBER_W'),
  442. (Tag: PR_OFFICE2_TELEPHONE_NUMBER_A; Name: 'OFFICE2_TELEPHONE_NUMBER_A'),
  443. (Tag: PR_MOBILE_TELEPHONE_NUMBER; Name: 'MOBILE_TELEPHONE_NUMBER'),
  444. (Tag: PR_MOBILE_TELEPHONE_NUMBER_W; Name: 'MOBILE_TELEPHONE_NUMBER_W'),
  445. (Tag: PR_MOBILE_TELEPHONE_NUMBER_A; Name: 'MOBILE_TELEPHONE_NUMBER_A'),
  446. (Tag: PR_CELLULAR_TELEPHONE_NUMBER; Name: 'CELLULAR_TELEPHONE_NUMBER'),
  447. (Tag: PR_CELLULAR_TELEPHONE_NUMBER_W; Name: 'CELLULAR_TELEPHONE_NUMBER_W'),
  448. (Tag: PR_CELLULAR_TELEPHONE_NUMBER_A; Name: 'CELLULAR_TELEPHONE_NUMBER_A'),
  449. (Tag: PR_RADIO_TELEPHONE_NUMBER; Name: 'RADIO_TELEPHONE_NUMBER'),
  450. (Tag: PR_RADIO_TELEPHONE_NUMBER_W; Name: 'RADIO_TELEPHONE_NUMBER_W'),
  451. (Tag: PR_RADIO_TELEPHONE_NUMBER_A; Name: 'RADIO_TELEPHONE_NUMBER_A'),
  452. (Tag: PR_CAR_TELEPHONE_NUMBER; Name: 'CAR_TELEPHONE_NUMBER'),
  453. (Tag: PR_CAR_TELEPHONE_NUMBER_W; Name: 'CAR_TELEPHONE_NUMBER_W'),
  454. (Tag: PR_CAR_TELEPHONE_NUMBER_A; Name: 'CAR_TELEPHONE_NUMBER_A'),
  455. (Tag: PR_OTHER_TELEPHONE_NUMBER; Name: 'OTHER_TELEPHONE_NUMBER'),
  456. (Tag: PR_OTHER_TELEPHONE_NUMBER_W; Name: 'OTHER_TELEPHONE_NUMBER_W'),
  457. (Tag: PR_OTHER_TELEPHONE_NUMBER_A; Name: 'OTHER_TELEPHONE_NUMBER_A'),
  458. (Tag: PR_TRANSMITABLE_DISPLAY_NAME; Name: 'TRANSMITABLE_DISPLAY_NAME'),
  459. (Tag: PR_TRANSMITABLE_DISPLAY_NAME_W; Name: 'TRANSMITABLE_DISPLAY_NAME_W'),
  460. (Tag: PR_TRANSMITABLE_DISPLAY_NAME_A; Name: 'TRANSMITABLE_DISPLAY_NAME_A'),
  461. (Tag: PR_PAGER_TELEPHONE_NUMBER; Name: 'PAGER_TELEPHONE_NUMBER'),
  462. (Tag: PR_PAGER_TELEPHONE_NUMBER_W; Name: 'PAGER_TELEPHONE_NUMBER_W'),
  463. (Tag: PR_PAGER_TELEPHONE_NUMBER_A; Name: 'PAGER_TELEPHONE_NUMBER_A'),
  464. (Tag: PR_BEEPER_TELEPHONE_NUMBER; Name: 'BEEPER_TELEPHONE_NUMBER'),
  465. (Tag: PR_BEEPER_TELEPHONE_NUMBER_W; Name: 'BEEPER_TELEPHONE_NUMBER_W'),
  466. (Tag: PR_BEEPER_TELEPHONE_NUMBER_A; Name: 'BEEPER_TELEPHONE_NUMBER_A'),
  467. (Tag: PR_USER_CERTIFICATE; Name: 'USER_CERTIFICATE'),
  468. (Tag: PR_PRIMARY_FAX_NUMBER; Name: 'PRIMARY_FAX_NUMBER'),
  469. (Tag: PR_PRIMARY_FAX_NUMBER_W; Name: 'PRIMARY_FAX_NUMBER_W'),
  470. (Tag: PR_PRIMARY_FAX_NUMBER_A; Name: 'PRIMARY_FAX_NUMBER_A'),
  471. (Tag: PR_BUSINESS_FAX_NUMBER; Name: 'BUSINESS_FAX_NUMBER'),
  472. (Tag: PR_BUSINESS_FAX_NUMBER_W; Name: 'BUSINESS_FAX_NUMBER_W'),
  473. (Tag: PR_BUSINESS_FAX_NUMBER_A; Name: 'BUSINESS_FAX_NUMBER_A'),
  474. (Tag: PR_HOME_FAX_NUMBER; Name: 'HOME_FAX_NUMBER'),
  475. (Tag: PR_HOME_FAX_NUMBER_W; Name: 'HOME_FAX_NUMBER_W'),
  476. (Tag: PR_HOME_FAX_NUMBER_A; Name: 'HOME_FAX_NUMBER_A'),
  477. (Tag: PR_COUNTRY; Name: 'COUNTRY'),
  478. (Tag: PR_COUNTRY_W; Name: 'COUNTRY_W'),
  479. (Tag: PR_COUNTRY_A; Name: 'COUNTRY_A'),
  480. (Tag: PR_LOCALITY; Name: 'LOCALITY'),
  481. (Tag: PR_LOCALITY_W; Name: 'LOCALITY_W'),
  482. (Tag: PR_LOCALITY_A; Name: 'LOCALITY_A'),
  483. (Tag: PR_STATE_OR_PROVINCE; Name: 'STATE_OR_PROVINCE'),
  484. (Tag: PR_STATE_OR_PROVINCE_W; Name: 'STATE_OR_PROVINCE_W'),
  485. (Tag: PR_STATE_OR_PROVINCE_A; Name: 'STATE_OR_PROVINCE_A'),
  486. (Tag: PR_STREET_ADDRESS; Name: 'STREET_ADDRESS'),
  487. (Tag: PR_STREET_ADDRESS_W; Name: 'STREET_ADDRESS_W'),
  488. (Tag: PR_STREET_ADDRESS_A; Name: 'STREET_ADDRESS_A'),
  489. (Tag: PR_POSTAL_CODE; Name: 'POSTAL_CODE'),
  490. (Tag: PR_POSTAL_CODE_W; Name: 'POSTAL_CODE_W'),
  491. (Tag: PR_POSTAL_CODE_A; Name: 'POSTAL_CODE_A'),
  492. (Tag: PR_POST_OFFICE_BOX; Name: 'POST_OFFICE_BOX'),
  493. (Tag: PR_POST_OFFICE_BOX_W; Name: 'POST_OFFICE_BOX_W'),
  494. (Tag: PR_POST_OFFICE_BOX_A; Name: 'POST_OFFICE_BOX_A'),
  495. (Tag: PR_BUSINESS_ADDRESS_POST_OFFICE_BOX; Name: 'BUSINESS_ADDRESS_POST_OFFICE_BOX'),
  496. (Tag: PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_W; Name: 'BUSINESS_ADDRESS_POST_OFFICE_BOX_W'),
  497. (Tag: PR_BUSINESS_ADDRESS_POST_OFFICE_BOX_A; Name: 'BUSINESS_ADDRESS_POST_OFFICE_BOX_A'),
  498. (Tag: PR_TELEX_NUMBER; Name: 'TELEX_NUMBER'),
  499. (Tag: PR_TELEX_NUMBER_W; Name: 'TELEX_NUMBER_W'),
  500. (Tag: PR_TELEX_NUMBER_A; Name: 'TELEX_NUMBER_A'),
  501. (Tag: PR_ISDN_NUMBER; Name: 'ISDN_NUMBER'),
  502. (Tag: PR_ISDN_NUMBER_W; Name: 'ISDN_NUMBER_W'),
  503. (Tag: PR_ISDN_NUMBER_A; Name: 'ISDN_NUMBER_A'),
  504. (Tag: PR_ASSISTANT_TELEPHONE_NUMBER; Name: 'ASSISTANT_TELEPHONE_NUMBER'),
  505. (Tag: PR_ASSISTANT_TELEPHONE_NUMBER_W; Name: 'ASSISTANT_TELEPHONE_NUMBER_W'),
  506. (Tag: PR_ASSISTANT_TELEPHONE_NUMBER_A; Name: 'ASSISTANT_TELEPHONE_NUMBER_A'),
  507. (Tag: PR_HOME2_TELEPHONE_NUMBER; Name: 'HOME2_TELEPHONE_NUMBER'),
  508. (Tag: PR_HOME2_TELEPHONE_NUMBER_W; Name: 'HOME2_TELEPHONE_NUMBER_W'),
  509. (Tag: PR_HOME2_TELEPHONE_NUMBER_A; Name: 'HOME2_TELEPHONE_NUMBER_A'),
  510. (Tag: PR_ASSISTANT; Name: 'ASSISTANT'),
  511. (Tag: PR_ASSISTANT_W; Name: 'ASSISTANT_W'),
  512. (Tag: PR_ASSISTANT_A; Name: 'ASSISTANT_A'),
  513. (Tag: PR_SEND_RICH_INFO; Name: 'SEND_RICH_INFO'),
  514. (Tag: PR_WEDDING_ANNIVERSARY; Name: 'WEDDING_ANNIVERSARY'),
  515. (Tag: PR_BIRTHDAY; Name: 'BIRTHDAY'),
  516. (Tag: PR_HOBBIES; Name: 'HOBBIES'),
  517. (Tag: PR_HOBBIES_W; Name: 'HOBBIES_W'),
  518. (Tag: PR_HOBBIES_A; Name: 'HOBBIES_A'),
  519. (Tag: PR_MIDDLE_NAME; Name: 'MIDDLE_NAME'),
  520. (Tag: PR_MIDDLE_NAME_W; Name: 'MIDDLE_NAME_W'),
  521. (Tag: PR_MIDDLE_NAME_A; Name: 'MIDDLE_NAME_A'),
  522. (Tag: PR_DISPLAY_NAME_PREFIX; Name: 'DISPLAY_NAME_PREFIX'),
  523. (Tag: PR_DISPLAY_NAME_PREFIX_W; Name: 'DISPLAY_NAME_PREFIX_W'),
  524. (Tag: PR_DISPLAY_NAME_PREFIX_A; Name: 'DISPLAY_NAME_PREFIX_A'),
  525. (Tag: PR_PROFESSION; Name: 'PROFESSION'),
  526. (Tag: PR_PROFESSION_W; Name: 'PROFESSION_W'),
  527. (Tag: PR_PROFESSION_A; Name: 'PROFESSION_A'),
  528. (Tag: PR_PREFERRED_BY_NAME; Name: 'PREFERRED_BY_NAME'),
  529. (Tag: PR_PREFERRED_BY_NAME_W; Name: 'PREFERRED_BY_NAME_W'),
  530. (Tag: PR_PREFERRED_BY_NAME_A; Name: 'PREFERRED_BY_NAME_A'),
  531. (Tag: PR_SPOUSE_NAME; Name: 'SPOUSE_NAME'),
  532. (Tag: PR_SPOUSE_NAME_W; Name: 'SPOUSE_NAME_W'),
  533. (Tag: PR_SPOUSE_NAME_A; Name: 'SPOUSE_NAME_A'),
  534. (Tag: PR_COMPUTER_NETWORK_NAME; Name: 'COMPUTER_NETWORK_NAME'),
  535. (Tag: PR_COMPUTER_NETWORK_NAME_W; Name: 'COMPUTER_NETWORK_NAME_W'),
  536. (Tag: PR_COMPUTER_NETWORK_NAME_A; Name: 'COMPUTER_NETWORK_NAME_A'),
  537. (Tag: PR_CUSTOMER_ID; Name: 'CUSTOMER_ID'),
  538. (Tag: PR_CUSTOMER_ID_W; Name: 'CUSTOMER_ID_W'),
  539. (Tag: PR_CUSTOMER_ID_A; Name: 'CUSTOMER_ID_A'),
  540. (Tag: PR_TTYTDD_PHONE_NUMBER; Name: 'TTYTDD_PHONE_NUMBER'),
  541. (Tag: PR_TTYTDD_PHONE_NUMBER_W; Name: 'TTYTDD_PHONE_NUMBER_W'),
  542. (Tag: PR_TTYTDD_PHONE_NUMBER_A; Name: 'TTYTDD_PHONE_NUMBER_A'),
  543. (Tag: PR_FTP_SITE; Name: 'FTP_SITE'),
  544. (Tag: PR_FTP_SITE_W; Name: 'FTP_SITE_W'),
  545. (Tag: PR_FTP_SITE_A; Name: 'FTP_SITE_A'),
  546. (Tag: PR_GENDER; Name: 'GENDER'),
  547. (Tag: PR_MANAGER_NAME; Name: 'MANAGER_NAME'),
  548. (Tag: PR_MANAGER_NAME_W; Name: 'MANAGER_NAME_W'),
  549. (Tag: PR_MANAGER_NAME_A; Name: 'MANAGER_NAME_A'),
  550. (Tag: PR_NICKNAME; Name: 'NICKNAME'),
  551. (Tag: PR_NICKNAME_W; Name: 'NICKNAME_W'),
  552. (Tag: PR_NICKNAME_A; Name: 'NICKNAME_A'),
  553. (Tag: PR_PERSONAL_HOME_PAGE; Name: 'PERSONAL_HOME_PAGE'),
  554. (Tag: PR_PERSONAL_HOME_PAGE_W; Name: 'PERSONAL_HOME_PAGE_W'),
  555. (Tag: PR_PERSONAL_HOME_PAGE_A; Name: 'PERSONAL_HOME_PAGE_A'),
  556. (Tag: PR_BUSINESS_HOME_PAGE; Name: 'BUSINESS_HOME_PAGE'),
  557. (Tag: PR_BUSINESS_HOME_PAGE_W; Name: 'BUSINESS_HOME_PAGE_W'),
  558. (Tag: PR_BUSINESS_HOME_PAGE_A; Name: 'BUSINESS_HOME_PAGE_A'),
  559. (Tag: PR_CONTACT_VERSION; Name: 'CONTACT_VERSION'),
  560. (Tag: PR_CONTACT_ENTRYIDS; Name: 'CONTACT_ENTRYIDS'),
  561. (Tag: PR_CONTACT_ADDRTYPES; Name: 'CONTACT_ADDRTYPES'),
  562. (Tag: PR_CONTACT_ADDRTYPES_W; Name: 'CONTACT_ADDRTYPES_W'),
  563. (Tag: PR_CONTACT_ADDRTYPES_A; Name: 'CONTACT_ADDRTYPES_A'),
  564. (Tag: PR_CONTACT_DEFAULT_ADDRESS_INDEX; Name: 'CONTACT_DEFAULT_ADDRESS_INDEX'),
  565. (Tag: PR_CONTACT_EMAIL_ADDRESSES; Name: 'CONTACT_EMAIL_ADDRESSES'),
  566. (Tag: PR_CONTACT_EMAIL_ADDRESSES_W; Name: 'CONTACT_EMAIL_ADDRESSES_W'),
  567. (Tag: PR_CONTACT_EMAIL_ADDRESSES_A; Name: 'CONTACT_EMAIL_ADDRESSES_A'),
  568. (Tag: PR_COMPANY_MAIN_PHONE_NUMBER; Name: 'COMPANY_MAIN_PHONE_NUMBER'),
  569. (Tag: PR_COMPANY_MAIN_PHONE_NUMBER_W; Name: 'COMPANY_MAIN_PHONE_NUMBER_W'),
  570. (Tag: PR_COMPANY_MAIN_PHONE_NUMBER_A; Name: 'COMPANY_MAIN_PHONE_NUMBER_A'),
  571. (Tag: PR_CHILDRENS_NAMES; Name: 'CHILDRENS_NAMES'),
  572. (Tag: PR_CHILDRENS_NAMES_W; Name: 'CHILDRENS_NAMES_W'),
  573. (Tag: PR_CHILDRENS_NAMES_A; Name: 'CHILDRENS_NAMES_A'),
  574. (Tag: PR_HOME_ADDRESS_CITY; Name: 'HOME_ADDRESS_CITY'),
  575. (Tag: PR_HOME_ADDRESS_CITY_W; Name: 'HOME_ADDRESS_CITY_W'),
  576. (Tag: PR_HOME_ADDRESS_CITY_A; Name: 'HOME_ADDRESS_CITY_A'),
  577. (Tag: PR_HOME_ADDRESS_COUNTRY; Name: 'HOME_ADDRESS_COUNTRY'),
  578. (Tag: PR_HOME_ADDRESS_COUNTRY_W; Name: 'HOME_ADDRESS_COUNTRY_W'),
  579. (Tag: PR_HOME_ADDRESS_COUNTRY_A; Name: 'HOME_ADDRESS_COUNTRY_A'),
  580. (Tag: PR_HOME_ADDRESS_POSTAL_CODE; Name: 'HOME_ADDRESS_POSTAL_CODE'),
  581. (Tag: PR_HOME_ADDRESS_POSTAL_CODE_W; Name: 'HOME_ADDRESS_POSTAL_CODE_W'),
  582. (Tag: PR_HOME_ADDRESS_POSTAL_CODE_A; Name: 'HOME_ADDRESS_POSTAL_CODE_A'),
  583. (Tag: PR_HOME_ADDRESS_STATE_OR_PROVINCE; Name: 'HOME_ADDRESS_STATE_OR_PROVINCE'),
  584. (Tag: PR_HOME_ADDRESS_STATE_OR_PROVINCE_W; Name: 'HOME_ADDRESS_STATE_OR_PROVINCE_W'),
  585. (Tag: PR_HOME_ADDRESS_STATE_OR_PROVINCE_A; Name: 'HOME_ADDRESS_STATE_OR_PROVINCE_A'),
  586. (Tag: PR_HOME_ADDRESS_STREET; Name: 'HOME_ADDRESS_STREET'),
  587. (Tag: PR_HOME_ADDRESS_STREET_W; Name: 'HOME_ADDRESS_STREET_W'),
  588. (Tag: PR_HOME_ADDRESS_STREET_A; Name: 'HOME_ADDRESS_STREET_A'),
  589. (Tag: PR_HOME_ADDRESS_POST_OFFICE_BOX; Name: 'HOME_ADDRESS_POST_OFFICE_BOX'),
  590. (Tag: PR_HOME_ADDRESS_POST_OFFICE_BOX_W; Name: 'HOME_ADDRESS_POST_OFFICE_BOX_W'),
  591. (Tag: PR_HOME_ADDRESS_POST_OFFICE_BOX_A; Name: 'HOME_ADDRESS_POST_OFFICE_BOX_A'),
  592. (Tag: PR_OTHER_ADDRESS_CITY; Name: 'OTHER_ADDRESS_CITY'),
  593. (Tag: PR_OTHER_ADDRESS_CITY_W; Name: 'OTHER_ADDRESS_CITY_W'),
  594. (Tag: PR_OTHER_ADDRESS_CITY_A; Name: 'OTHER_ADDRESS_CITY_A'),
  595. (Tag: PR_OTHER_ADDRESS_COUNTRY; Name: 'OTHER_ADDRESS_COUNTRY'),
  596. (Tag: PR_OTHER_ADDRESS_COUNTRY_W; Name: 'OTHER_ADDRESS_COUNTRY_W'),
  597. (Tag: PR_OTHER_ADDRESS_COUNTRY_A; Name: 'OTHER_ADDRESS_COUNTRY_A'),
  598. (Tag: PR_OTHER_ADDRESS_POSTAL_CODE; Name: 'OTHER_ADDRESS_POSTAL_CODE'),
  599. (Tag: PR_OTHER_ADDRESS_POSTAL_CODE_W; Name: 'OTHER_ADDRESS_POSTAL_CODE_W'),
  600. (Tag: PR_OTHER_ADDRESS_POSTAL_CODE_A; Name: 'OTHER_ADDRESS_POSTAL_CODE_A'),
  601. (Tag: PR_OTHER_ADDRESS_STATE_OR_PROVINCE; Name: 'OTHER_ADDRESS_STATE_OR_PROVINCE'),
  602. (Tag: PR_OTHER_ADDRESS_STATE_OR_PROVINCE_W; Name: 'OTHER_ADDRESS_STATE_OR_PROVINCE_W'),
  603. (Tag: PR_OTHER_ADDRESS_STATE_OR_PROVINCE_A; Name: 'OTHER_ADDRESS_STATE_OR_PROVINCE_A'),
  604. (Tag: PR_OTHER_ADDRESS_STREET; Name: 'OTHER_ADDRESS_STREET'),
  605. (Tag: PR_OTHER_ADDRESS_STREET_W; Name: 'OTHER_ADDRESS_STREET_W'),
  606. (Tag: PR_OTHER_ADDRESS_STREET_A; Name: 'OTHER_ADDRESS_STREET_A'),
  607. (Tag: PR_OTHER_ADDRESS_POST_OFFICE_BOX; Name: 'OTHER_ADDRESS_POST_OFFICE_BOX'),
  608. (Tag: PR_OTHER_ADDRESS_POST_OFFICE_BOX_W; Name: 'OTHER_ADDRESS_POST_OFFICE_BOX_W'),
  609. (Tag: PR_OTHER_ADDRESS_POST_OFFICE_BOX_A; Name: 'OTHER_ADDRESS_POST_OFFICE_BOX_A'),
  610. (Tag: PR_USER_X509_CERTIFICATE; Name: 'USER_X509_CERTIFICATE'),
  611. (Tag: PR_SEND_INTERNET_ENCODING; Name: 'SEND_INTERNET_ENCODING'),
  612. (Tag: PR_BUSINESS_ADDRESS_CITY; Name: 'BUSINESS_ADDRESS_CITY'),
  613. (Tag: PR_BUSINESS_ADDRESS_COUNTRY; Name: 'BUSINESS_ADDRESS_COUNTRY'),
  614. (Tag: PR_BUSINESS_ADDRESS_POSTAL_CODE; Name: 'BUSINESS_ADDRESS_POSTAL_CODE'),
  615. (Tag: PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE; Name: 'BUSINESS_ADDRESS_STATE_OR_PROVINCE'),
  616. (Tag: PR_BUSINESS_ADDRESS_STREET; Name: 'BUSINESS_ADDRESS_STREET'),
  617. (Tag: PR_RECIPIENT_TYPE; Name: 'RECIPIENT_TYPE')
  618. );
  619. var
  620. I: Integer;
  621. PropID: ULONG;
  622. begin
  623. Result := '';
  624. PropID := PROP_ID(PropValue.ulPropTag);
  625. for I := Low(TagNames) to High(TagNames) do
  626. if PROP_ID(TagNames[I].Tag) = PropID then
  627. begin
  628. Result := TagNames[I].Name;
  629. Break;
  630. end;
  631. if Result = '' then Result := Format('[%x]', [PropID]);
  632. end;
  633. end.