![]() |
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! |
Re: Vista Suche in Delphi nutzen
Frag mal Sakura. Der hat schon mindestens einen Search Provider geschrieben ;-)
|
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 :-( |
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:
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!
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. Hier noch ein paar Links zu dem Thema falls jemand in die Thematik mit einsteigen mag: ![]() ![]() ![]() 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 |
Re: Vista Suche in Delphi nutzen
Hallo,
ich gebe zu, von dem Thema habe ich keine Ahnung. Was mich verwundert:
SQL-Code:
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
SQL-Code:
oder
SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX System
SQL-Code:
Eigentlich sollte aber
SELECT Top 5 SYSTEMINDEX.ItemPathDisplay FROM SYSTEMINDEX
SQL-Code:
reichen. Oder wird hier ein "vom Gewohnten" abweichendes SQL verwandt?
SELECT Top 5 ItemPathDisplay FROM SYSTEMINDEX
|
Re: Vista Suche in Delphi nutzen
Zitat:
Der QueryHelper den ich anspreche übersetzt sozusagen in die übliche Variante fürs AdoQuery... Genaueres dazu gibt es hier: ![]() 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 |
Re: Vista Suche in Delphi nutzen
Zitat:
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:
aus und schau, ob das noch ein SQL-Statement ist, das den Vorgaben der MSDN entspricht. Was passiert, wenn Du folgendes ausprobierst?
qry.SQL.Text := pSQL;
ShowMessage(pSQL); qry.Active := True; // hier kracht es aber gewaltig!
Delphi-Quellcode:
pQuery := 'SELECT Top 5 System.ItemPathDisplay FROM SYSTEMINDEX';
qry.SQL.Text := pQuery; qry.Active := True; |
Re: Vista Suche in Delphi nutzen
Zitat:
SQL-Code:
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)
SQL-Code:
Naja alles das gleiche es krackt nach wie vor :shock:
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)
|
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:
Hier erwarte ich als SQL nun sowas:
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
SQL-Code:
wobei die Ergebnismenge höchstwahrscheinlich leer ist 8)
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
|
Re: Vista Suche in Delphi nutzen
Zitat:
SQL-Code:
Mit der gleichen Fehlermeldung wie gehabt also "unbekannter Fehler" :shock:
SELECT "System.ItemUrl" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
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 09:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz