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

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. {  Indezing Service Query 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: nyquery.h, released August 2001. The original Pascal   }
  9. { code is: NtQuery.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 JwaNtQuery;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "ntquery.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   ActiveX, ComObj, {TODO} JwaWinType;
  52. type
  53.   // TODO STUBS  see CmdTree.h (cmdtree.idl)
  54.   IFilter = Pointer;
  55.   IUnkown = Pointer;
  56.   ICommand = Pointer;
  57.   PPWCHAR = ^PWCHAR;
  58.   REFIID = TGUID; // also in ActiveDS
  59.   DBID = Pointer;
  60.   DBCOMMANDTREE = Pointer;
  61.   PDBCOMMANDTREE = Pointer;
  62.   DBCOMMANDOP = Pointer;
  63. //
  64. // Use this path for the null catalog, one that doesn't have an index.
  65. // Use it to search for properties of files that are not indexed.
  66. //
  67. const
  68.   CINULLCATALOG = '::_noindex_::';
  69.   {$EXTERNALSYM CINULLCATALOG}
  70. //
  71. // Use this path to connect to the server for administration work
  72. // (i.e. DocStoreAdmin.) No catalog is associated with the connection
  73. //
  74.   CIADMIN = '::_nodocstore_::';
  75.   {$EXTERNALSYM CIADMIN}
  76. //
  77. // Minimal support for persistent handlers.
  78. //
  79. function LoadIFilter(pwcsPath: PWCHAR; pUnkOuter: IUnknown; out ppIUnk: IFilter): HRESULT; stdcall;
  80. {$EXTERNALSYM LoadIFilter}
  81. const
  82.   LIFF_LOAD_DEFINED_FILTER                   = 1;
  83.   {$EXTERNALSYM LIFF_LOAD_DEFINED_FILTER}
  84.   LIFF_IMPLEMENT_TEXT_FILTER_FALLBACK_POLICY = 2;
  85.   {$EXTERNALSYM LIFF_IMPLEMENT_TEXT_FILTER_FALLBACK_POLICY}
  86.   LIFF_FORCE_TEXT_FILTER_FALLBACK            = 3;
  87.   {$EXTERNALSYM LIFF_FORCE_TEXT_FILTER_FALLBACK}
  88. function LoadIFilterEx(pwcsPath: PWCHAR; dwFlags: DWORD; const riid: REFIID; out ppIUnk: IUnknown): HRESULT; stdcall;
  89. {$EXTERNALSYM LoadIFilterEx}
  90. function BindIFilterFromStorage(pStg: IStorage; pUnkOuter: IUnknown; out ppIUnk: IFilter): HRESULT; stdcall;
  91. {$EXTERNALSYM BindIFilterFromStorage}
  92. function BindIFilterFromStream(pStm: IStream; pUnkOuter: IUnkown; out ppIUnk: IFilter): HRESULT; stdcall;
  93. {$EXTERNALSYM BindIFilterFromStream}
  94. function LocateCatalogsW(pwszScope: PWCHAR; iBmk: ULONG; pwszMachine: PWCHAR;
  95.   var pccMachine: ULONG; pwszCat: PWCHAR; var pccCat: ULONG): HRESULT; stdcall;
  96. {$EXTERNALSYM LocateCatalogsW}
  97. //
  98. // For calling from VB
  99. //
  100. function LocateCatalogsA(pwszScope: PCHAR; iBmk: ULONG; pwszMachine: PCHAR;
  101.   var pccMachine: ULONG; pwszCat: PCHAR; var pccCat: ULONG): HRESULT; stdcall;
  102. {$EXTERNALSYM LocateCatalogsA}
  103. {$IFDEF UNICODE}
  104. function LocateCatalogs(pwszScope: PWCHAR; iBmk: ULONG; pwszMachine: PWCHAR;
  105.   var pccMachine: ULONG; pwszCat: PWCHAR; var pccCat: ULONG): HRESULT; stdcall;
  106. {$EXTERNALSYM LocateCatalogs}
  107. {$ELSE}
  108. function LocateCatalogs(pwszScope: PCHAR; iBmk: ULONG; pwszMachine: PCHAR;
  109.   var pccMachine: ULONG; pwszCat: PCHAR; var pccCat: ULONG): HRESULT; stdcall;
  110. {$EXTERNALSYM LocateCatalogs}
  111. {$ENDIF}
  112. // The Index Server Data Source Object CLSID
  113. const
  114.   CLSID_INDEX_SERVER_DSO: TGUID = (
  115.     D1:$F9AE8980; D2:$7E52; D3:$11d0; D4:($89,$64,$00,$C0,$4F,$D6,$11,$D7));
  116.   {$EXTERNALSYM CLSID_INDEX_SERVER_DSO}
  117. // The storage property set
  118.   PSGUID_STORAGE: TGUID = (
  119.     D1:$b725f130; D2:$47ef; D3:$101a; D4:($a5,$f1,$02,$60,$8c,$9e,$eb,$ac));
  120.   {$EXTERNALSYM PSGUID_STORAGE}
  121. //#define PID_STG_DICTIONARY            ((PROPID) 0x00000000) //reserved
  122. //#define PID_STG_CODEPAGE              ((PROPID) 0x00000001) //reserved
  123.   PID_STG_DIRECTORY      = PROPID($00000002);
  124.   {$EXTERNALSYM PID_STG_DIRECTORY}
  125.   PID_STG_CLASSID        = PROPID($00000003);
  126.   {$EXTERNALSYM PID_STG_CLASSID}
  127.   PID_STG_STORAGETYPE    = PROPID($00000004);
  128.   {$EXTERNALSYM PID_STG_STORAGETYPE}
  129.   PID_STG_VOLUME_ID      = PROPID($00000005);
  130.   {$EXTERNALSYM PID_STG_VOLUME_ID}
  131.   PID_STG_PARENT_WORKID  = PROPID($00000006);
  132.   {$EXTERNALSYM PID_STG_PARENT_WORKID}
  133.   PID_STG_SECONDARYSTORE = PROPID($00000007);
  134.   {$EXTERNALSYM PID_STG_SECONDARYSTORE}
  135.   PID_STG_FILEINDEX      = PROPID($00000008);
  136.   {$EXTERNALSYM PID_STG_FILEINDEX}
  137.   PID_STG_LASTCHANGEUSN  = PROPID($00000009);
  138.   {$EXTERNALSYM PID_STG_LASTCHANGEUSN}
  139.   PID_STG_NAME           = PROPID($0000000a);
  140.   {$EXTERNALSYM PID_STG_NAME}
  141.   PID_STG_PATH           = PROPID($0000000b);
  142.   {$EXTERNALSYM PID_STG_PATH}
  143.   PID_STG_SIZE           = PROPID($0000000c);
  144.   {$EXTERNALSYM PID_STG_SIZE}
  145.   PID_STG_ATTRIBUTES     = PROPID($0000000d);
  146.   {$EXTERNALSYM PID_STG_ATTRIBUTES}
  147.   PID_STG_WRITETIME      = PROPID($0000000e);
  148.   {$EXTERNALSYM PID_STG_WRITETIME}
  149.   PID_STG_CREATETIME     = PROPID($0000000f);
  150.   {$EXTERNALSYM PID_STG_CREATETIME}
  151.   PID_STG_ACCESSTIME     = PROPID($00000010);
  152.   {$EXTERNALSYM PID_STG_ACCESSTIME}
  153.   PID_STG_CHANGETIME     = PROPID($00000011);
  154.   {$EXTERNALSYM PID_STG_CHANGETIME}
  155.   PID_STG_CONTENTS       = PROPID($00000013);
  156.   {$EXTERNALSYM PID_STG_CONTENTS}
  157.   PID_STG_SHORTNAME      = PROPID($00000014);
  158.   {$EXTERNALSYM PID_STG_SHORTNAME}
  159.   PID_STG_MAX            = PID_STG_SHORTNAME;
  160.   {$EXTERNALSYM PID_STG_MAX}
  161.   CSTORAGEPROPERTY       = $15;
  162.   {$EXTERNALSYM CSTORAGEPROPERTY}
  163. // File System Content Index Framework property set
  164.   DBPROPSET_FSCIFRMWRK_EXT: TGUID = (
  165.     D1:$A9BD1526; D2:$6A80; D3:$11D0; D4:($8C,$9D,$00,$20,$AF,$1D,$74,$0E));
  166.   {$EXTERNALSYM DBPROPSET_FSCIFRMWRK_EXT}
  167.   DBPROP_CI_CATALOG_NAME   = 2;
  168.   {$EXTERNALSYM DBPROP_CI_CATALOG_NAME}
  169.   DBPROP_CI_INCLUDE_SCOPES = 3;
  170.   {$EXTERNALSYM DBPROP_CI_INCLUDE_SCOPES}
  171.   DBPROP_CI_DEPTHS         = 4; // obsolete
  172.   {$EXTERNALSYM DBPROP_CI_DEPTHS}
  173.   DBPROP_CI_SCOPE_FLAGS    = 4;
  174.   {$EXTERNALSYM DBPROP_CI_SCOPE_FLAGS}
  175.   DBPROP_CI_EXCLUDE_SCOPES = 5;
  176.   {$EXTERNALSYM DBPROP_CI_EXCLUDE_SCOPES}
  177.   DBPROP_CI_SECURITY_ID    = 6;
  178.   {$EXTERNALSYM DBPROP_CI_SECURITY_ID}
  179.   DBPROP_CI_QUERY_TYPE     = 7;
  180.   {$EXTERNALSYM DBPROP_CI_QUERY_TYPE}
  181. // Query Extension property set
  182.   DBPROPSET_QUERYEXT: TGUID = (
  183.     D1:$A7AC77ED; D2:$F8D7; D3:$11CE; D4:($A7,$98,$00,$20,$F8,$00,$80,$25));
  184.   {$EXTERNALSYM DBPROPSET_QUERYEXT}
  185.   DBPROP_USECONTENTINDEX         = 2;
  186.   {$EXTERNALSYM DBPROP_USECONTENTINDEX}
  187.   DBPROP_DEFERNONINDEXEDTRIMMING = 3;
  188.   {$EXTERNALSYM DBPROP_DEFERNONINDEXEDTRIMMING}
  189.   DBPROP_USEEXTENDEDDBTYPES      = 4;
  190.   {$EXTERNALSYM DBPROP_USEEXTENDEDDBTYPES}
  191.   DBPROP_FIRSTROWS               = 7;
  192.   {$EXTERNALSYM DBPROP_FIRSTROWS}
  193. // Content Index Framework Core property set
  194.   DBPROPSET_CIFRMWRKCORE_EXT: TGUID = (
  195.     D1:$afafaca5; D2:$b5d1; D3:$11d0; D4:($8c,$62,$00,$c0,$4f,$c2,$db,$8d));
  196.   {$EXTERNALSYM DBPROPSET_CIFRMWRKCORE_EXT}
  197.   DBPROP_MACHINE      = 2;
  198.   {$EXTERNALSYM DBPROP_MACHINE}
  199.   DBPROP_CLIENT_CLSID = 3;
  200.   {$EXTERNALSYM DBPROP_CLIENT_CLSID}
  201. // MSIDXS Rowset property set
  202.   DBPROPSET_MSIDXS_ROWSETEXT: TGUID = (
  203.     D1:$aa6ee6b0; D2:$e828; D3:$11d0; D4:($b2,$3e,$00,$aa,$00,$47,$fc,$01));
  204.   {$EXTERNALSYM DBPROPSET_MSIDXS_ROWSETEXT}
  205.   MSIDXSPROP_ROWSETQUERYSTATUS     = 2;
  206.   {$EXTERNALSYM MSIDXSPROP_ROWSETQUERYSTATUS}
  207.   MSIDXSPROP_COMMAND_LOCALE_STRING = 3;
  208.   {$EXTERNALSYM MSIDXSPROP_COMMAND_LOCALE_STRING}
  209.   MSIDXSPROP_QUERY_RESTRICTION     = 4;
  210.   {$EXTERNALSYM MSIDXSPROP_QUERY_RESTRICTION}
  211. //
  212. // Query status values returned by MSIDXSPROP_ROWSETQUERYSTATUS
  213. //
  214. // Bits   Effect
  215. // -----  -----------------------------------------------------
  216. // 00-02  Fill Status: How data is being updated, if at all.
  217. // 03-15  Bitfield query reliability: How accurate the result is
  218.   STAT_BUSY    = (0);
  219.   {$EXTERNALSYM STAT_BUSY}
  220.   STAT_ERROR   = ($1);
  221.   {$EXTERNALSYM STAT_ERROR}
  222.   STAT_DONE    = ($2);
  223.   {$EXTERNALSYM STAT_DONE}
  224.   STAT_REFRESH = ($3);
  225.   {$EXTERNALSYM STAT_REFRESH}
  226. function QUERY_FILL_STATUS(x: DWORD): DWORD;
  227. {$EXTERNALSYM QUERY_FILL_STATUS}
  228. const
  229.   STAT_PARTIAL_SCOPE            = ($8);
  230.   {$EXTERNALSYM STAT_PARTIAL_SCOPE}
  231.   STAT_NOISE_WORDS              = ($10);
  232.   {$EXTERNALSYM STAT_NOISE_WORDS}
  233.   STAT_CONTENT_OUT_OF_DATE      = ($20);
  234.   {$EXTERNALSYM STAT_CONTENT_OUT_OF_DATE}
  235.   STAT_REFRESH_INCOMPLETE       = ($40);
  236.   {$EXTERNALSYM STAT_REFRESH_INCOMPLETE}
  237.   STAT_CONTENT_QUERY_INCOMPLETE = ($80);
  238.   {$EXTERNALSYM STAT_CONTENT_QUERY_INCOMPLETE}
  239.   STAT_TIME_LIMIT_EXCEEDED      = ($100);
  240.   {$EXTERNALSYM STAT_TIME_LIMIT_EXCEEDED}
  241.   STAT_SHARING_VIOLATION        = ($200);
  242.   {$EXTERNALSYM STAT_SHARING_VIOLATION}
  243. function QUERY_RELIABILITY_STATUS(x: DWORD): DWORD;
  244. {$EXTERNALSYM QUERY_RELIABILITY_STATUS}
  245. // Scope flags
  246. const
  247.   QUERY_SHALLOW       = 0;
  248.   {$EXTERNALSYM QUERY_SHALLOW}
  249.   QUERY_DEEP          = 1;
  250.   {$EXTERNALSYM QUERY_DEEP}
  251.   QUERY_PHYSICAL_PATH = 0;
  252.   {$EXTERNALSYM QUERY_PHYSICAL_PATH}
  253.   QUERY_VIRTUAL_PATH  = 2;
  254.   {$EXTERNALSYM QUERY_VIRTUAL_PATH}
  255. // query property set (PSGUID_QUERY) properties not defined in oledb.h
  256.   PROPID_QUERY_WORKID       = 5;
  257.   {$EXTERNALSYM PROPID_QUERY_WORKID}
  258.   PROPID_QUERY_UNFILTERED   = 7;
  259.   {$EXTERNALSYM PROPID_QUERY_UNFILTERED}
  260.   PROPID_QUERY_VIRTUALPATH  = 9;
  261.   {$EXTERNALSYM PROPID_QUERY_VIRTUALPATH}
  262.   PROPID_QUERY_LASTSEENTIME = 10;
  263.   {$EXTERNALSYM PROPID_QUERY_LASTSEENTIME}
  264. //
  265. // Change or get the current state of a catalog specified.
  266. //
  267.   CICAT_STOPPED    = $1;
  268.   {$EXTERNALSYM CICAT_STOPPED}
  269.   CICAT_READONLY   = $2;
  270.   {$EXTERNALSYM CICAT_READONLY}
  271.   CICAT_WRITABLE   = $4;
  272.   {$EXTERNALSYM CICAT_WRITABLE}
  273.   CICAT_NO_QUERY   = $8;
  274.   {$EXTERNALSYM CICAT_NO_QUERY}
  275.   CICAT_GET_STATE  = $10;
  276.   {$EXTERNALSYM CICAT_GET_STATE}
  277.   CICAT_ALL_OPENED = $20;
  278.   {$EXTERNALSYM CICAT_ALL_OPENED}
  279. function SetCatalogState(pwcsCat, pwcsMachine: PWCHAR; dwNewState: DWORD;
  280.   var pdwOldState: DWORD): HRESULT; stdcall;
  281. {$EXTERNALSYM SetCatalogState}
  282. //
  283. // Query catalog state
  284. //
  285. const
  286.   CI_STATE_SHADOW_MERGE          = $0001; // Index is performing a shadow merge
  287.   {$EXTERNALSYM CI_STATE_SHADOW_MERGE}
  288.   CI_STATE_MASTER_MERGE          = $0002; // Index is performing a master merge
  289.   {$EXTERNALSYM CI_STATE_MASTER_MERGE}
  290.   CI_STATE_CONTENT_SCAN_REQUIRED = $0004; // Index is likely corrupt, and a rescan is required
  291.   {$EXTERNALSYM CI_STATE_CONTENT_SCAN_REQUIRED}
  292.   CI_STATE_ANNEALING_MERGE       = $0008; // Index is performing an annealing (optimizing) merge
  293.   {$EXTERNALSYM CI_STATE_ANNEALING_MERGE}
  294.   CI_STATE_SCANNING              = $0010; // Scans are in-progress
  295.   {$EXTERNALSYM CI_STATE_SCANNING}
  296.   CI_STATE_RECOVERING            = $0020; // Index metadata is being recovered
  297.   {$EXTERNALSYM CI_STATE_RECOVERING}
  298.   CI_STATE_INDEX_MIGRATION_MERGE = $0040; // Reserved for future use
  299.   {$EXTERNALSYM CI_STATE_INDEX_MIGRATION_MERGE}
  300.   CI_STATE_LOW_MEMORY            = $0080; // Indexing is paused due to low memory availability
  301.   {$EXTERNALSYM CI_STATE_LOW_MEMORY}
  302.   CI_STATE_HIGH_IO               = $0100; // Indexing is paused due to a high rate of I/O
  303.   {$EXTERNALSYM CI_STATE_HIGH_IO}
  304.   CI_STATE_MASTER_MERGE_PAUSED   = $0200; // Master merge is paused
  305.   {$EXTERNALSYM CI_STATE_MASTER_MERGE_PAUSED}
  306.   CI_STATE_READ_ONLY             = $0400; // Indexing has been manually paused (read-only)
  307.   {$EXTERNALSYM CI_STATE_READ_ONLY}
  308.   CI_STATE_BATTERY_POWER         = $0800; // Indexing is paused to conserve battery life
  309.   {$EXTERNALSYM CI_STATE_BATTERY_POWER}
  310.   CI_STATE_USER_ACTIVE           = $1000; // Indexing is paused due to high user activity (keyboard/mouse)
  311.   {$EXTERNALSYM CI_STATE_USER_ACTIVE}
  312.   CI_STATE_STARTING              = $2000; // Index is still starting up
  313.   {$EXTERNALSYM CI_STATE_STARTING}
  314.   CI_STATE_READING_USNS          = $4000; // USNs on NTFS volumes are being processed
  315.   {$EXTERNALSYM CI_STATE_READING_USNS}
  316. //#include <pshpack4.h>
  317. type
  318.   _CI_STATE = record
  319.     cbStruct: DWORD;
  320.     cWordList: DWORD;
  321.     cPersistentIndex: DWORD;
  322.     cQueries: DWORD;
  323.     cDocuments: DWORD;
  324.     cFreshTest: DWORD;
  325.     dwMergeProgress: DWORD;
  326.     eState: DWORD;
  327.     cFilteredDocuments: DWORD;
  328.     cTotalDocuments: DWORD;
  329.     cPendingScans: DWORD;
  330.     dwIndexSize: DWORD;
  331.     cUniqueKeys: DWORD;
  332.     cSecQDocuments: DWORD;
  333.     dwPropCacheSize: DWORD;
  334.   end;
  335.   {$EXTERNALSYM _CI_STATE}
  336.   CI_STATE = _CI_STATE;
  337.   {$EXTERNALSYM CI_STATE}
  338.   TCiState = CI_STATE;
  339.   PCiState = ^CI_STATE;
  340. //#include <poppack.h>
  341. function CIState(pwcsCat, pwcsMachine: PWCHAR; var pCiState: CI_STATE): HRESULT; stdcall;
  342. {$EXTERNALSYM CIState}
  343. //
  344. // Create an ICommand, specifying scopes, catalogs, and machines
  345. //
  346. function CIMakeICommand(out ppCommand: ICommand; cScope: ULONG; aDepths: LPDWORD;
  347.   awcsScope, awcsCatalogs, awcsMachine: PPWCHAR): HRESULT; stdcall;
  348. {$EXTERNALSYM CIMakeICommand}
  349. //
  350. // Create an ICommand, specifying a catalog and machine
  351. //
  352. function CICreateCommand(out ppCommand: IUnknown; pUnkOuter: IUnknown;
  353.   const riid: REFIID; pwcsCatalog, pwcsMachine: PWCHAR): HRESULT; stdcall;
  354. {$EXTERNALSYM CICreateCommand}
  355. type
  356.   tagCIPROPERTYDEF = record
  357.     wcsFriendlyName: LPWSTR;
  358.     dbType: DWORD;
  359.     dbCol: DBID;
  360.   end;
  361.   {$EXTERNALSYM tagCIPROPERTYDEF}
  362.   CIPROPERTYDEF = tagCIPROPERTYDEF;
  363.   {$EXTERNALSYM CIPROPERTYDEF}
  364.   TCiPropertyDef = CIPROPERTYDEF;
  365.   PCiPropertyDef = ^CIPROPERTYDEF;
  366. //
  367. // Values for ulDialect in CITextToSelectTreeEx and CITextToFullTreeEx
  368. //
  369. const
  370.   ISQLANG_V1 = 1; // Same as the non-Ex versions
  371.   {$EXTERNALSYM ISQLANG_V1}
  372.   ISQLANG_V2 = 2;
  373.   {$EXTERNALSYM ISQLANG_V2}
  374. //
  375. // Convert pwszRestriction in Triplish to a command tree.
  376. //
  377. function CITextToSelectTree(pwszRestriction: PWCHAR; var ppTree: PDBCOMMANDTREE;
  378.   cProperties: ULONG; pProperties: PCIPROPERTYDEF; LocaleID: LCID): HRESULT; stdcall;
  379. {$EXTERNALSYM CITextToSelectTree}
  380. function CITextToSelectTreeEx(pwszRestriction: PWCHAR; ulDialect: ULONG;
  381.   var ppTree: PDBCOMMANDTREE; cProperties: ULONG; pProperties: PCIPROPERTYDEF;
  382.   LocaleID: LCID): HRESULT; stdcall;
  383. {$EXTERNALSYM CITextToSelectTreeEx}
  384. //
  385. // Convert pwszRestriction in Triplish, project columns, sort columns
  386. // and grouping columns to a command tree.
  387. //
  388. function CITextToFullTree(pwszRestriction, pwszColumns, pwszSortColumns,
  389.   pwszGroupings: PWCHAR; var ppTree: PDBCOMMANDTREE; cProperties: ULONG;
  390.   pProperties: PCIPROPERTYDEF; LocaleID: LCID): HRESULT; stdcall;
  391. {$EXTERNALSYM CITextToFullTree}
  392. function CITextToFullTreeEx(pwszRestriction: PWCHAR; ulDialect: ULONG;
  393.   pwszColumns, pwszSortColumns, pwszGroupings: PWCHAR; var ppTree: PDBCOMMANDTREE;
  394.   cProperties: ULONG; pProperties: PCIPROPERTYDEF; LocaleID: LCID): HRESULT; stdcall;
  395. {$EXTERNALSYM CITextToFullTreeEx}
  396. //
  397. // Build a simple restriction node.
  398. //
  399. function CIBuildQueryNode(wcsProperty: PWCHAR; dbOperator: DBCOMMANDOP;
  400.   const pvarPropertyValue: PROPVARIANT; var ppTree: PDBCOMMANDTREE;
  401.   cProperties: ULONG; pProperty: PCIPROPERTYDEF; LocaleID: LCID): HRESULT; stdcall;
  402. {$EXTERNALSYM CIBuildQueryNode}
  403. //
  404. // Build a restriction tree from an existing tree (could be empty) and a newly added node/tree.
  405. //
  406. function CIBuildQueryTree(pExistingTree: PDBCOMMANDTREE; dbBoolOp: DBCOMMANDOP;
  407.   cSiblings: ULONG; ppSibsToCombine: PDBCOMMANDTREE; var ppTree: DBCOMMANDTREE): HRESULT; stdcall;
  408. {$EXTERNALSYM CIBuildQueryTree}
  409. //
  410. // Convert restriction tree, project columns, sort columns
  411. // and grouping columns to a command tree.
  412. //
  413. function CIRestrictionToFullTree(const pTree: DBCOMMANDTREE; pwszColumns,
  414.   pwszSortColumns, pwszGroupings: PWCHAR; var ppTree: PDBCOMMANDTREE;
  415.   cProperties: ULONG; pReserved: PCIPROPERTYDEF; LocaleID: LCID): HRESULT; stdcall;
  416. {$EXTERNALSYM CIRestrictionToFullTree}
  417. implementation
  418. function QUERY_FILL_STATUS(x: DWORD): DWORD;
  419. begin
  420.   Result := x and $7;
  421. end;
  422. function QUERY_RELIABILITY_STATUS(x: DWORD): DWORD;
  423. begin
  424.   Result := x and $FFF8;
  425. end;
  426. const
  427.   query = 'query.dll';
  428. {$IFDEF DYNAMIC_LINK}
  429. var
  430.   _LoadIFilterEx: Pointer;
  431. function LoadIFilterEx;
  432. begin
  433.   GetProcedureAddress(_LoadIFilterEx, query, 'LoadIFilterEx');
  434.   asm
  435.     mov esp, ebp
  436.     pop ebp
  437.     jmp [_LoadIFilterEx]
  438.   end;
  439. end;
  440. {$ELSE}
  441. function LoadIFilterEx; external query name 'LoadIFilterEx';
  442. {$ENDIF DYNAMIC_LINK}
  443. {$IFDEF DYNAMIC_LINK}
  444. var
  445.   _LoadIFilter: Pointer;
  446. function LoadIFilter;
  447. begin
  448.   GetProcedureAddress(_LoadIFilter, query, 'LoadIFilter');
  449.   asm
  450.     mov esp, ebp
  451.     pop ebp
  452.     jmp [_LoadIFilter]
  453.   end;
  454. end;
  455. {$ELSE}
  456. function LoadIFilter; external query name 'LoadIFilter';
  457. {$ENDIF DYNAMIC_LINK}
  458. {$IFDEF DYNAMIC_LINK}
  459. var
  460.   _BindIFilterFromStorage: Pointer;
  461. function BindIFilterFromStorage;
  462. begin
  463.   GetProcedureAddress(_BindIFilterFromStorage, query, 'BindIFilterFromStorage');
  464.   asm
  465.     mov esp, ebp
  466.     pop ebp
  467.     jmp [_BindIFilterFromStorage]
  468.   end;
  469. end;
  470. {$ELSE}
  471. function BindIFilterFromStorage; external query name 'BindIFilterFromStorage';
  472. {$ENDIF DYNAMIC_LINK}
  473. {$IFDEF DYNAMIC_LINK}
  474. var
  475.   _BindIFilterFromStream: Pointer;
  476. function BindIFilterFromStream;
  477. begin
  478.   GetProcedureAddress(_BindIFilterFromStream, query, 'BindIFilterFromStream');
  479.   asm
  480.     mov esp, ebp
  481.     pop ebp
  482.     jmp [_BindIFilterFromStream]
  483.   end;
  484. end;
  485. {$ELSE}
  486. function BindIFilterFromStream; external query name 'BindIFilterFromStream';
  487. {$ENDIF DYNAMIC_LINK}
  488. {$IFDEF DYNAMIC_LINK}
  489. var
  490.   _LocateCatalogsW: Pointer;
  491. function LocateCatalogsW;
  492. begin
  493.   GetProcedureAddress(_LocateCatalogsW, query, 'LocateCatalogsW');
  494.   asm
  495.     mov esp, ebp
  496.     pop ebp
  497.     jmp [_LocateCatalogsW]
  498.   end;
  499. end;
  500. {$ELSE}
  501. function LocateCatalogsW; external query name 'LocateCatalogsW';
  502. {$ENDIF DYNAMIC_LINK}
  503. {$IFDEF DYNAMIC_LINK}
  504. var
  505.   _LocateCatalogsA: Pointer;
  506. function LocateCatalogsA;
  507. begin
  508.   GetProcedureAddress(_LocateCatalogsA, query, 'LocateCatalogsA');
  509.   asm
  510.     mov esp, ebp
  511.     pop ebp
  512.     jmp [_LocateCatalogsA]
  513.   end;
  514. end;
  515. {$ELSE}
  516. function LocateCatalogsA; external query name 'LocateCatalogsA';
  517. {$ENDIF DYNAMIC_LINK}
  518. {$IFDEF UNICODE}
  519. {$IFDEF DYNAMIC_LINK}
  520. var
  521.   _LocateCatalogs: Pointer;
  522. function LocateCatalogs;
  523. begin
  524.   GetProcedureAddress(_LocateCatalogs, query, 'LocateCatalogsW');
  525.   asm
  526.     mov esp, ebp
  527.     pop ebp
  528.     jmp [_LocateCatalogs]
  529.   end;
  530. end;
  531. {$ELSE}
  532. function LocateCatalogs; external query name 'LocateCatalogsW';
  533. {$ENDIF DYNAMIC_LINK}
  534. {$ELSE}
  535. {$IFDEF DYNAMIC_LINK}
  536. var
  537.   _LocateCatalogs: Pointer;
  538. function LocateCatalogs;
  539. begin
  540.   GetProcedureAddress(_LocateCatalogs, query, 'LocateCatalogsA');
  541.   asm
  542.     mov esp, ebp
  543.     pop ebp
  544.     jmp [_LocateCatalogs]
  545.   end;
  546. end;
  547. {$ELSE}
  548. function LocateCatalogs; external query name 'LocateCatalogsA';
  549. {$ENDIF DYNAMIC_LINK}
  550. {$ENDIF}
  551. {$IFDEF DYNAMIC_LINK}
  552. var
  553.   _SetCatalogState: Pointer;
  554. function SetCatalogState;
  555. begin
  556.   GetProcedureAddress(_SetCatalogState, query, 'SetCatalogState');
  557.   asm
  558.     mov esp, ebp
  559.     pop ebp
  560.     jmp [_SetCatalogState]
  561.   end;
  562. end;
  563. {$ELSE}
  564. function SetCatalogState; external query name 'SetCatalogState';
  565. {$ENDIF DYNAMIC_LINK}
  566. {$IFDEF DYNAMIC_LINK}
  567. var
  568.   _CIState: Pointer;
  569. function CIState;
  570. begin
  571.   GetProcedureAddress(_CIState, query, 'CIState');
  572.   asm
  573.     mov esp, ebp
  574.     pop ebp
  575.     jmp [_CIState]
  576.   end;
  577. end;
  578. {$ELSE}
  579. function CIState; external query name 'CIState';
  580. {$ENDIF DYNAMIC_LINK}
  581. {$IFDEF DYNAMIC_LINK}
  582. var
  583.   _CIMakeICommand: Pointer;
  584. function CIMakeICommand;
  585. begin
  586.   GetProcedureAddress(_CIMakeICommand, query, 'CIMakeICommand');
  587.   asm
  588.     mov esp, ebp
  589.     pop ebp
  590.     jmp [_CIMakeICommand]
  591.   end;
  592. end;
  593. {$ELSE}
  594. function CIMakeICommand; external query name 'CIMakeICommand';
  595. {$ENDIF DYNAMIC_LINK}
  596. {$IFDEF DYNAMIC_LINK}
  597. var
  598.   _CICreateCommand: Pointer;
  599. function CICreateCommand;
  600. begin
  601.   GetProcedureAddress(_CICreateCommand, query, 'CICreateCommand');
  602.   asm
  603.     mov esp, ebp
  604.     pop ebp
  605.     jmp [_CICreateCommand]
  606.   end;
  607. end;
  608. {$ELSE}
  609. function CICreateCommand; external query name 'CICreateCommand';
  610. {$ENDIF DYNAMIC_LINK}
  611. {$IFDEF DYNAMIC_LINK}
  612. var
  613.   _CITextToSelectTree: Pointer;
  614. function CITextToSelectTree;
  615. begin
  616.   GetProcedureAddress(_CITextToSelectTree, query, 'CITextToSelectTree');
  617.   asm
  618.     mov esp, ebp
  619.     pop ebp
  620.     jmp [_CITextToSelectTree]
  621.   end;
  622. end;
  623. {$ELSE}
  624. function CITextToSelectTree; external query name 'CITextToSelectTree';
  625. {$ENDIF DYNAMIC_LINK}
  626. {$IFDEF DYNAMIC_LINK}
  627. var
  628.   _CITextToSelectTreeEx: Pointer;
  629. function CITextToSelectTreeEx;
  630. begin
  631.   GetProcedureAddress(_CITextToSelectTreeEx, query, 'CITextToSelectTreeEx');
  632.   asm
  633.     mov esp, ebp
  634.     pop ebp
  635.     jmp [_CITextToSelectTreeEx]
  636.   end;
  637. end;
  638. {$ELSE}
  639. function CITextToSelectTreeEx; external query name 'CITextToSelectTreeEx';
  640. {$ENDIF DYNAMIC_LINK}
  641. {$IFDEF DYNAMIC_LINK}
  642. var
  643.   _CITextToFullTree: Pointer;
  644. function CITextToFullTree;
  645. begin
  646.   GetProcedureAddress(_CITextToFullTree, query, 'CITextToSelectTreeEx');
  647.   asm
  648.     mov esp, ebp
  649.     pop ebp
  650.     jmp [_CITextToFullTree]
  651.   end;
  652. end;
  653. {$ELSE}
  654. function CITextToFullTree; external query name 'CITextToSelectTreeEx';
  655. {$ENDIF DYNAMIC_LINK}
  656. {$IFDEF DYNAMIC_LINK}
  657. var
  658.   _CITextToFullTreeEx: Pointer;
  659. function CITextToFullTreeEx;
  660. begin
  661.   GetProcedureAddress(_CITextToFullTreeEx, query, 'CITextToFullTreeEx');
  662.   asm
  663.     mov esp, ebp
  664.     pop ebp
  665.     jmp [_CITextToFullTreeEx]
  666.   end;
  667. end;
  668. {$ELSE}
  669. function CITextToFullTreeEx; external query name 'CITextToFullTreeEx';
  670. {$ENDIF DYNAMIC_LINK}
  671. {$IFDEF DYNAMIC_LINK}
  672. var
  673.   _CIBuildQueryNode: Pointer;
  674. function CIBuildQueryNode;
  675. begin
  676.   GetProcedureAddress(_CIBuildQueryNode, query, 'CIBuildQueryNode');
  677.   asm
  678.     mov esp, ebp
  679.     pop ebp
  680.     jmp [_CIBuildQueryNode]
  681.   end;
  682. end;
  683. {$ELSE}
  684. function CIBuildQueryNode; external query name 'CIBuildQueryNode';
  685. {$ENDIF DYNAMIC_LINK}
  686. {$IFDEF DYNAMIC_LINK}
  687. var
  688.   _CIBuildQueryTree: Pointer;
  689. function CIBuildQueryTree;
  690. begin
  691.   GetProcedureAddress(_CIBuildQueryTree, query, 'CIBuildQueryTree');
  692.   asm
  693.     mov esp, ebp
  694.     pop ebp
  695.     jmp [_CIBuildQueryTree]
  696.   end;
  697. end;
  698. {$ELSE}
  699. function CIBuildQueryTree; external query name 'CIBuildQueryTree';
  700. {$ENDIF DYNAMIC_LINK}
  701. {$IFDEF DYNAMIC_LINK}
  702. var
  703.   _CIRestrictionToFullTree: Pointer;
  704. function CIRestrictionToFullTree;
  705. begin
  706.   GetProcedureAddress(_CIRestrictionToFullTree, query, 'CIRestrictionToFullTree');
  707.   asm
  708.     mov esp, ebp
  709.     pop ebp
  710.     jmp [_CIRestrictionToFullTree]
  711.   end;
  712. end;
  713. {$ELSE}
  714. function CIRestrictionToFullTree; external query name 'CIRestrictionToFullTree';
  715. {$ENDIF DYNAMIC_LINK}
  716. end.