AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vista Suche in Delphi nutzen

Ein Thema von stOrM · begonnen am 3. Feb 2009 · letzter Beitrag vom 17. Feb 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#1

Vista Suche in Delphi nutzen

  Alt 3. Feb 2009, 14:38
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!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)
Online

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#2

Re: Vista Suche in Delphi nutzen

  Alt 3. Feb 2009, 16:05
Frag mal Sakura. Der hat schon mindestens einen Search Provider geschrieben
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Vista Suche in Delphi nutzen

  Alt 3. Feb 2009, 17:01
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
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 06:08
Hmmm, scheint ja ein echt kompliziertes Thema zu sein, oder es interessiert mal wieder nur mich
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

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
Angehängte Dateien
Dateityp: pas searchapilib_tlb_269.pas (62,9 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 11:36
Hallo,

ich gebe zu, von dem Thema habe ich keine Ahnung.
Was mich verwundert: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:SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX System oderSELECT Top 5 SYSTEMINDEX.ItemPathDisplay FROM SYSTEMINDEX Eigentlich sollte aber SELECT Top 5 ItemPathDisplay FROM SYSTEMINDEX reichen. Oder wird hier ein "vom Gewohnten" abweichendes SQL verwandt?
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 12:14
Zitat von nahpets:
Hallo,

ich gebe zu, von dem Thema habe ich keine Ahnung.
Was mich verwundert: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:SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX System oderSELECT Top 5 SYSTEMINDEX.ItemPathDisplay FROM SYSTEMINDEX Eigentlich sollte aber 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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 12:55
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

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;
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 13:11
Zitat von nahpets:
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

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:

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:

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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 13:28
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

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:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031) wobei die Ergebnismenge höchstwahrscheinlich leer ist 8)
  Mit Zitat antworten Zitat
Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
434 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Vista Suche in Delphi nutzen

  Alt 12. Feb 2009, 13:46
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

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:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031) wobei die Ergebnismenge höchstwahrscheinlich leer ist 8)
Gesagt getan!

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

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

Anonsten brauchste bei weiteren postings nicht mehr den kompl. Code schreiben das Query reicht! Habs grad dynamisch gemacht hier per Editfeld Jetzt kann ich schnell per Copy&Paste reinsemmeln auf das es weiter krachen möge hehe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.
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