Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Vista Suche in Delphi nutzen (https://www.delphipraxis.net/128650-vista-suche-delphi-nutzen.html)

stOrM 3. Feb 2009 13:38


Vista Suche in Delphi nutzen
 
Hi,
wie aus dem Titel hervorgeht wollte ich mal fragen, ob das schon jemand erfolgreich gemacht hat?
Mein erster Ansatz war der Versuch über Ado, der leider erfolglos blieb, die Beispiele die ich dazu gefunden hatte endeten alle mehr oder weniger in OleExceptions. Im SDK konnte ich auch nicht all zu viel darüber finden, unter anderem fehlen mir wohl auch diverse Sachen wie SearchApiGuids die ich nirgends finden kann...

Wäre schön wenn jemand ein Beispiel hat wie man das ganze nutzt um sagen wir mal einen Dateinamen suchen zu können?

Viele Grüße
s!

Phoenix 3. Feb 2009 15:05

Re: Vista Suche in Delphi nutzen
 
Frag mal Sakura. Der hat schon mindestens einen Search Provider geschrieben ;-)

stOrM 3. Feb 2009 16:01

Re: Vista Suche in Delphi nutzen
 
Danke für die Info!
Naja wollte es halt hier öffentlich halten falls jemand das gleiche problem hat.
Vielleicht liesst er ja den Thread hier wär schön :-)

Was irgendwie seltsam ist das ich eine 80041820 Exception bekomme, nach einer Suche im Netz steht da der Index Dienst läuft nicht, was quatsch ist weil der läuft sehr wohl bei mir...

Jetzt wirds noch viel besser 80041820 beseitigt war ein Fehler meinerseits dafür hab ich nun einen unbekannten Fehler ohne jegliche Beschreibung :-(

stOrM 12. Feb 2009 05:08

Re: Vista Suche in Delphi nutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmmm, scheint ja ein echt kompliziertes Thema zu sein, oder es interessiert mal wieder nur mich :mrgreen:
Ich hab mal ein wenig weiter gefummelt und bekomm jetzt wenigstens ein wenig Informationen bevor es dann wieder kracht!

Vielleicht mag mal jemand drüber kucken, dass Problem ist irgendwie das ich den Fehler nicht lokalisieren kann, da ich nicht weiß, ob der Fehler nun am Query liegt, an Ado, oder an der TLB selber. Nun ja mit einer Fehlermeldung "unbekannter Fehler" läßt sich auch schlecht arbeiten :shock:

So mal ein bischen Code:

Delphi-Quellcode:
  public
    { Public-Deklarationen }
    pSearchMgr : ISearchManager;
    pSearchCatMgr : ISearchCatalogManager;
    pQueryHelper : ISearchQueryHelper;

    pCatStat,
    pReason : TOleEnum;

    pInxCount : Integer;
    pIndexedUrl : PWideChar;

    pConnectionString : PWideChar;
    pConnectionTimeOut : Cardinal;
    pQuery,
    pSQL : PWideChar;
    pSearchString : PWideChar;

...

procedure TMainForm.FormShow(Sender: TObject);
var
  pReasonRes : string;
begin
  pSearchMgr := CoCSearchManager.Create;

  try
    // the valid catalog is systemindex only! 
    pSearchMgr.GetCatalog('SYSTEMINDEX', pSearchCatMgr);

    // get some stats: pStatus, pPausedReason
    pSearchCatMgr.GetCatalogStatus(pCatStat, pReason);

    case pReason of
      CATALOG_PAUSED_REASON_NONE: pReasonRes := 'none';
      CATALOG_PAUSED_REASON_HIGH_IO: pReasonRes := 'high io';
      CATALOG_PAUSED_REASON_HIGH_CPU: pReasonRes := 'high cpu';
      CATALOG_PAUSED_REASON_HIGH_NTF_RATE: pReasonRes := 'high ntf rate';
      CATALOG_PAUSED_REASON_LOW_BATTERY: pReasonRes := 'low battery';
      CATALOG_PAUSED_REASON_LOW_MEMORY: pReasonRes := 'low memory';
      CATALOG_PAUSED_REASON_LOW_DISK: pReasonRes := 'low disk';
      CATALOG_PAUSED_REASON_DELAYED_RECOVERY: pReasonRes := 'delayed recovery';
      CATALOG_PAUSED_REASON_USER_ACTIVE: pReasonRes := 'user active';
      CATALOG_PAUSED_REASON_EXTERNAL: pReasonRes := 'external';
      CATALOG_PAUSED_REASON_UPGRADING: pReasonRes := 'upgrading';
    end;

    case pCatStat of
      CATALOG_STATUS_IDLE: lblStatus.Caption := Format('Status: %0:s reason: %1:s', ['idle', pReasonRes]);
      CATALOG_STATUS_PAUSED: lblStatus.Caption := Format('Status: %0:s reason: %1:s', ['paused', pReasonRes]);
      CATALOG_STATUS_RECOVERING: lblStatus.Caption := Format('Status: %0:s reason: %1:s', ['recovering', pReasonRes]);
      CATALOG_STATUS_FULL_CRAWL: lblStatus.Caption := Format('Status: %0:s reason: %1:s', ['full crawl', pReasonRes]);
      CATALOG_STATUS_INCREMENTAL_CRAWL: Format('Status: %0:s reason: %1:s', ['incremental crawl', pReasonRes]);
      CATALOG_STATUS_PROCESSING_NOTIFICATIONS: Format('Status: %0:s reason: %1:s', ['notifications', pReasonRes]);
      CATALOG_STATUS_SHUTTING_DOWN: Format('Status: %0:s reason: %1:s', ['shutting down', pReasonRes]);
    end;

    // how many items indexed
    pSearchCatMgr.NumberOfItems(pInxCount);
    lblIdxCount.Caption := Format('Items currently indexed: %d', [pInxCount]);

    // get indexed file
    pSearchCatMgr.URLBeingIndexed(pIndexedUrl);
    lblIndexer.Caption := Format('Last indexed %s', [pIndexedUrl]);

    // ISearchQueryHelper interface
    pSearchCatMgr.GetQueryHelper(pQueryHelper);

    // get timeout value
    pSearchCatMgr.Get_ConnectTimeout(pConnectionTimeOut);

    // get the connectionstring for connection to the oledb
    pQueryHelper.Get_ConnectionString(pConnectionString);

    // connect to oledb using the pconnectionstring {adoconnection}
    con.ConnectionString := pConnectionString;
    con.ConnectionTimeout := pConnectionTimeOut;
    Con.LoginPrompt := False;
    con.Connected := True;

  except
   on E: EOleException do
   begin
     ShowMessage(E.Message);
   end;
  end;

end;

// hier gehts los
procedure TMainForm.btnSearchClick(Sender: TObject);
begin

 pQuery := 'SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX';

  try
   // query helper generates a valid sql string...
   pQueryHelper.GenerateSQLFromUserQuery(pQuery, pSql);


   qry.SQL.Text := pSQL;  
   qry.Active := True;  // hier kracht es aber gewaltig!

  except
  on e: Exception do
  begin
    ShowMessage(E.Message);
    end;
  end;

end;

initialization
  CoInitializeEx(nil, COINIT_MULTITHREADED);

finalization
  CoUninitialize;
end.
Vielleicht sollte ich noch erwähnen, dass ich die Exe unter Vista nur mit Adminrechten starten kann, weil sonst knallts schon bei der Ausführung!

Hier noch ein paar Links zu dem Thema falls jemand in die Thematik mit einsteigen mag:

danielmoth
devx
MSDN

Getestet wurde das ganze unter Vista Ultimate 32 Bit EN / DE mit Delphi 2009 Architect Sp1 incl. DB Update 1 sowie Help Update
Na dann hoff ich mal, dass mir da jemand auf die sprünge helfen kann!
Viele Grüsse
Marc

nahpets 12. Feb 2009 10:36

Re: Vista Suche in Delphi nutzen
 
Hallo,

ich gebe zu, von dem Thema habe ich keine Ahnung.
Was mich verwundert:
SQL-Code:
SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX
Eigentlich kenne ich die Syntax nur so, dass man Tabellenname.Spaltenname angibt oder Tabellenalias.Spaltenname. Hier würde ich daher eine der Varianten erwarten:
SQL-Code:
SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX System
oder
SQL-Code:
SELECT Top 5 SYSTEMINDEX.ItemPathDisplay FROM SYSTEMINDEX
Eigentlich sollte aber
SQL-Code:
SELECT Top 5 ItemPathDisplay FROM SYSTEMINDEX
reichen. Oder wird hier ein "vom Gewohnten" abweichendes SQL verwandt?

stOrM 12. Feb 2009 11:14

Re: Vista Suche in Delphi nutzen
 
Zitat:

Zitat von nahpets
Hallo,

ich gebe zu, von dem Thema habe ich keine Ahnung.
Was mich verwundert:
SQL-Code:
SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX
Eigentlich kenne ich die Syntax nur so, dass man Tabellenname.Spaltenname angibt oder Tabellenalias.Spaltenname. Hier würde ich daher eine der Varianten erwarten:
SQL-Code:
SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX System
oder
SQL-Code:
SELECT Top 5 SYSTEMINDEX.ItemPathDisplay FROM SYSTEMINDEX
Eigentlich sollte aber
SQL-Code:
SELECT Top 5 ItemPathDisplay FROM SYSTEMINDEX
reichen. Oder wird hier ein "vom Gewohnten" abweichendes SQL verwandt?

Hi ja leider ne komplett andere Variante!
Der QueryHelper den ich anspreche übersetzt sozusagen in die übliche Variante fürs AdoQuery...

Genaueres dazu gibt es hier: Msdn

edit: Mist noch vergessen, würde nicht normalerweise, wenn es ein Problem mit dem SQL String wäre eine Meldung kommen die das beeinhaltet? sowas in der Art wie Fehler in SQL ..... anstellen von "unbekannter Fehler"?

Gruß
Marc

nahpets 12. Feb 2009 11:55

Re: Vista Suche in Delphi nutzen
 
Zitat:

Zitat von stOrM
edit: Mist noch vergessen, würde nicht normalerweise, wenn es ein Problem mit dem SQL String wäre eine Meldung kommen die das beeinhaltet? sowas in der Art wie Fehler in SQL ..... anstellen von "unbekannter Fehler"?

Da ich vom MS-SQL-Server die Fehlermeldung "Fehler in der Nähe von...' gewohnt bin, ist "unbekannter Fehler" nicht unbedingt als gravierende Verschlechterung zu betrachten :wink:

Okay, bin mal Deinem Link gefolgt. Sagen wir mal so: Die dort beschriebene Abfragesprache hat (auf den ersten Blick) Ähnlichkeiten mit SQL, man sollte aber nicht vom bekannten SQL darauf schließen, dass Bekanntes hier auch verwendbar sein könnte.

Gib' doch mal bitte
Delphi-Quellcode:
qry.SQL.Text := pSQL;
ShowMessage(pSQL);
qry.Active := True;  // hier kracht es aber gewaltig!
aus und schau, ob das noch ein SQL-Statement ist, das den Vorgaben der MSDN entspricht. Was passiert, wenn Du folgendes ausprobierst?
Delphi-Quellcode:
pQuery      := 'SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX';
qry.SQL.Text := pQuery;
qry.Active  := True;

stOrM 12. Feb 2009 12:11

Re: Vista Suche in Delphi nutzen
 
Zitat:

Zitat von nahpets
Zitat:

Zitat von stOrM
edit: Mist noch vergessen, würde nicht normalerweise, wenn es ein Problem mit dem SQL String wäre eine Meldung kommen die das beeinhaltet? sowas in der Art wie Fehler in SQL ..... anstellen von "unbekannter Fehler"?

Da ich vom MS-SQL-Server die Fehlermeldung "Fehler in der Nähe von...' gewohnt bin, ist "unbekannter Fehler" nicht unbedingt als gravierende Verschlechterung zu betrachten :wink:

Okay, bin mal Deinem Link gefolgt. Sagen wir mal so: Die dort beschriebene Abfragesprache hat (auf den ersten Blick) Ähnlichkeiten mit SQL, man sollte aber nicht vom bekannten SQL darauf schließen, dass Bekanntes hier auch verwendbar sein könnte.

Gib' doch mal bitte
Delphi-Quellcode:
qry.SQL.Text := pSQL;
ShowMessage(pSQL);
qry.Active := True;  // hier kracht es aber gewaltig!
aus und schau, ob das noch ein SQL-Statement ist, das den Vorgaben der MSDN entspricht. Was passiert, wenn Du folgendes ausprobierst?
Delphi-Quellcode:
pQuery      := 'SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX';
qry.SQL.Text := pQuery;
qry.Active  := True;

Also Test ein Query gelassen wie es war, der SearchApi QueryHelper hat dann folgendes daraus gemacht:

SQL-Code:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"SELECT*"',1031) AND CONTAINS(*,'"Top*"',1031) AND CONTAINS(*,'"5*"',1031) AND ("System.FileName" LIKE 'System.ItemPathDisplay%' OR CONTAINS(*,'"System*"',1031) AND CONTAINS(*,'"ItemPathDisplay*"',1031)) AND CONTAINS(*,'"FROM*"',1031) AND CONTAINS(*,'"SYSTEM*"',1031) AND CONTAINS(*,'"INDEX*"',1031)
Dann hab ich mal diesen getestet spasseshalber: SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX System das ergab dann folgendes:

SQL-Code:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"SELECT*"',1031) AND CONTAINS(*,'"Top*"',1031) AND CONTAINS(*,'"5*"',1031) AND ("System.FileName" LIKE 'System.ItemPathDisplay%' OR CONTAINS(*,'"System*"',1031) AND CONTAINS(*,'"ItemPathDisplay*"',1031)) AND CONTAINS(*,'"FROM*"',1031) AND CONTAINS(*,'"SYSTEM*"',1031) AND CONTAINS(*,'"INDEX*"',1031) AND CONTAINS(*,'"System*"',1031)
Naja alles das gleiche es krackt nach wie vor :shock:

nahpets 12. Feb 2009 12:28

Re: Vista Suche in Delphi nutzen
 
Hallo,

das raff ich ja jetzt nun garnicht, dass sieht doch so aus, als würde hier versucht, nach den einzelnen Strings, aus denen Dein SQL besteht, zu suchen. Quasi: Das SQL sucht sich selber?

Das ist doch niemals so gewollt :roll:

Also bitte mal dasda probieren:
Delphi-Quellcode:
  pQuery := 'Jawassuchenwirdennjetztnuneigentlich';
  try
    // query helper generates a valid sql string...
    pQueryHelper.GenerateSQLFromUserQuery(pQuery, pSql);
    qry.SQL.Text := pSQL;  
    ShowMessage(qry.SQL.Text);
    qry.Active := True;  // hier kracht es hoffentlich nicht mehr.
  except
Hier erwarte ich als SQL nun sowas:
SQL-Code:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
wobei die Ergebnismenge höchstwahrscheinlich leer ist 8)

stOrM 12. Feb 2009 12:46

Re: Vista Suche in Delphi nutzen
 
Zitat:

Zitat von nahpets
Hallo,

das raff ich ja jetzt nun garnicht, dass sieht doch so aus, als würde hier versucht, nach den einzelnen Strings, aus denen Dein SQL besteht, zu suchen. Quasi: Das SQL sucht sich selber?

Das ist doch niemals so gewollt :roll:

Also bitte mal dasda probieren:
Delphi-Quellcode:
  pQuery := 'Jawassuchenwirdennjetztnuneigentlich';
  try
    // query helper generates a valid sql string...
    pQueryHelper.GenerateSQLFromUserQuery(pQuery, pSql);
    qry.SQL.Text := pSQL;  
    ShowMessage(qry.SQL.Text);
    qry.Active := True;  // hier kracht es hoffentlich nicht mehr.
  except
Hier erwarte ich als SQL nun sowas:
SQL-Code:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
wobei die Ergebnismenge höchstwahrscheinlich leer ist 8)

Gesagt getan!

SQL-Code:
SELECT "System.ItemUrl" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
Mit der gleichen Fehlermeldung wie gehabt also "unbekannter Fehler" :shock:

Ps. Hast Du Vista zufällig? Ich weiß im Moment nicht obs auch < Vista funzen würd aber dann könntest Du mal selber testen, weil Du scheinst gut SQL Plan zu haben :mrgreen:

Anonsten brauchste bei weiteren postings nicht mehr den kompl. Code schreiben das Query reicht! Habs grad dynamisch gemacht hier per Editfeld :-D Jetzt kann ich schnell per Copy&Paste reinsemmeln auf das es weiter krachen möge hehe


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz