![]() |
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 |
Re: Vista Suche in Delphi nutzen
Fehler nicht weg :evil:
Dann muss er irgendwo anders liegen und erst beim Öffnen der Abfrage "wirksam" werden (behaupte ich mal so :?) Interessant ist: erwartet:
SQL-Code:
bekommen:
SELECT "System.ItemUrl", "System.FileName" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
SQL-Code:
Nach welchen Kriterien erfolgt denn die Auswahl der auszugebenden Spalten?
SELECT "System.ItemUrl" FROM "SYSTEMINDEX" WHERE CONTAINS(*,'"Jawassuchenwirdennjetztnuneigentlich*"',1031)
An anderer Stelle im Programm reagierst Du auf EOleException, die hat ein paar Attribute mehr, wenn die auch hier geworfen wird, ließe sich da eventuell ja noch ein bisserl mehr Information rausholen :glaskugel:
Delphi-Quellcode:
Nach den bisherigen "Erkenntnissen" gehe ich davon aus, dass man zur Suche kein SQL benötigt, sondern per
except
on E: EOleException do begin ShowMessage(E.Message + #13 + 'ErrorCode: ' + IntToStr(ErrorCode) + #13 + 'Source: ' + Source); end; end; on e : Exception do begin ShowMessage(E.Message); end;
Delphi-Quellcode:
"alles" geschenkt bekommt.
pQueryHelper.GenerateSQLFromUserQuery
Eventuell mal
Delphi-Quellcode:
probieren, aber eigentlich ist das jetzt nur noch hilflose Daddelei, die ich da vorschlage, befürchte, dass ich da ohne die entsprechenden Werkzeuge keine verwertbare Hilfestellung mehr geben kann :cry:
qry.Close;
qry.SQL.Clear; qry.sql.Add(pSQL); qry.Open; PS: Habe kein Vista und nur Delphi 7, bin da doch ein bisserl altertümlich 8) |
Re: Vista Suche in Delphi nutzen
Zitat:
Weil dort gibt es ein Beispiel, leider sind meine C Kenntnisse mehr als mager aber kuckst Du ein Auszug aus den Parametern des CmdApps: Console.WriteLine("wssql <SQL query> [<Chapter Depth>]"); Console.WriteLine("\n<SQL query> will be sent to Windows Search and results returned."); Console.WriteLine(" Example queries: "); Console.WriteLine(" SELECT System.ItemName FROM SystemIndex"); Console.WriteLine(" SELECT System.ItemName FROM SystemIndex"); Console.WriteLine(" WHERE contains(*, 'dance*') AND System.Kind = 'email'"); Console.WriteLine(" GROUP ON System.Kind AGGREGATE Count() "); Console.WriteLine(" OVER (SELECT System.Kind, System.ItemName from SystemIndex)"); Console.WriteLine("\n<Chapter Depth> "); Console.WriteLine(" Recursion depth when expanding chapters for GROUP ON queries."); Console.WriteLine(" 0 = stop at first chapter, 1 = stop at second chapter, etc."); Console.WriteLine(" By default all chapters are expanded.") Also vermute ich mal, muss man Doch das Query übergebem? Was wohl passiert wenn ich den QueryHelper mal ganz aussen vor lasse? |
Re: Vista Suche in Delphi nutzen
Hallo,
nachdem, was ich bisher mitbekommen habe, baut der QueryHelper eine Abfrage / ein SQL für die als Parameter übergebene Zeichenfolge zusammen. Bin mir annähern 100% sicher, dass bei der Benutzung des QueryHelpers kein SQL nötig ist. Ohne den QueryHelper wäre mal einen Versuch wert. Weise Deiner Query mal bitte nur dasda
SQL-Code:
zu.
SELECT System.ItemName FROM SystemIndex
Wenn das nicht geht, muss der Fehler irgendwo anders sein. Hast Du da mit dem Debugger irgend eine Chance weiter zu kommen? Breakpoint auf qry.Active := True; und dort schon reindebuggen (wenn das geht). |
Re: Vista Suche in Delphi nutzen
Zitat:
Das wird immer unheimlicher, nu kommt also beim Klick auf den Search Button erst Ne Exception Addresse 00000000 danach unbekannter Fehler wie gehabt mit Ausführung des Querys debugging kein brauchbares Ergebnis bisher... In den SDK Beispielen ist das ganze auch sehr Mysteriös aufgebaut aber im Prinzip so wie ich das versuche hier! Nur mit dem Unterschied: // use ATL OLEDB classes to connect to the database and get the results CDataSource cDataSource; hr = cDataSource.OpenFromInitializationString(L"provide r=Search.CollatorDSO.1;EXTENDED PROPERTIES=\"Application=Windows\""); if (SUCCEEDED(hr)) { CSession cSession; Usw. Seltsam ist auch was die Exception mit 0000000 betrifft, die wird ausgelöst bei der Zuweisung des SQlStrings sowie bei Active = true, wenn beides auskommentiert wird keine Exceptions... Ado Prob? Zusatzinfo hierzu: Ich hab jetzt mal dem ConnectionDialog den ConnectionString im OI selbst übergeben Verbindung getestet rennt. Jetzt hab ich den AdoQeury mit Dem ConnectionDialog verbunden und dein Query unter SQL eingegeben, beim setzen auf Active im OI knallts! Da iss doch irgendwas im Busch? :shock: Ich denk mal das der Code dann wohl richtig war bisher?! |
Re: Vista Suche in Delphi nutzen
Hallo,
ich kapier' momentan garnix mehr. Hast Du die qry mit 'ner TDataSource und irgendwelchen Datenbankkomponeten verbunden? Mach' das mal weg. Eventuell kann ja nur irgendwer/irgendwas nicht angezeigt werden? Moment, Deine letzte Ergänzung: pSQL ist PWideChar. Von welchem Type ist qry.SQL.Text, beharken die sich eventuell? Deine Beschreibung klingt so ein bisserl wie: Die Zuweisung des SQL's funktioniert nicht, wird aber irgendwie übergangen und anschließend führen wir das nichtzugewiesenen SQL aus? Was ist mit
Delphi-Quellcode:
qry.sql.text := 'SELECT System.ItemName FROM SystemIndex';
|
Re: Vista Suche in Delphi nutzen
Zitat:
Jetzt mal nur die AdoConnection im OI mit den Sachen gefüttert, das Query damit Verbunden SQL eingegeben und Active gesetzt wirft eine OleException ohne weitere Details: 80040E14 |
Re: Vista Suche in Delphi nutzen
So ein Stoffwechselendprodukt :wink:
Probier es mal mit ADODataSet und CommandText. Aber da scheint ja doch Irgendwas im "Inneren" schief zu laufen. Für meinen Teil bin ich da jetzt mit dem Latein am Ende. Frag' mal bitte Google nach 80040E14. Da kommt so viel, dass ich da auf die Schnelle für mich keine Chance sehe, das "Richtige" Ergebnis zu finden. |
Re: Vista Suche in Delphi nutzen
Zitat:
Ja das sagste was bei Google wirste totgeschmiessen zu der Exception... Ich check das nochmal mit Adodataset und dann bin ich auch am ende ich weiss nimmer weiter nu... Trotzdem erstmal schönen Dank für die Mühe die ich gemacht hab :-) Du hast übrigends völlig recht gehabt, der QueryHelper baut den SQL Query selber auf habs gerade mal durchgespielt: Bsp.1: Project1.exe Daraus baut der QueryHelper folgenden Syntax:
SQL-Code:
Bsp.2:
SELECT "System.ItemUrl", "System.FileName" FROM "SystemIndex" WHERE ("System.FileName" LIKE 'Project1.exe%' OR CONTAINS(*,'"Project1*"',1031) AND CONTAINS(*,'"exe*"',1031))
*.exe Wird zu:
SQL-Code:
SELECT "System.ItemUrl", "System.FileExtension" FROM "SystemIndex" WHERE ("System.FileExtension" LIKE '.exe%' OR WorkId IS NULL)
|
Re: Vista Suche in Delphi nutzen
Hallo,
nach den letzten Erkenntnissen scheint der Fehler in der ADODB.Pas aufzutreten und zwar in der Zeile
Delphi-Quellcode:
Diese Zeile wird nur durchlaufen, wenn
/* Funktion RefreshFromOLEDB */
OLEDBCommand.QueryInterface(ICommandWithParameters, OLEDBParameters);
Delphi-Quellcode:
andernfalls wird
Command.CommandType = cmdText
Delphi-Quellcode:
aufgerufen.
RefreshFromADO
Allem Anschein nach gibt es Probleme bei der Prüfung von Parametern (die in unserem Fall allerdings nicht vorhanden sind). Es wäre mal einen Versuch wert, ParamCheck der Query auf false zu setzen. |
Re: Vista Suche in Delphi nutzen
Zitat:
ParamCheck steht auf falsch Ergebis leider wie immer es kracht! Grüß Marc Ps. Gibt es irgendwo von mir auch aus Trial Ado Komponenten sprich AdoQuery die nicht auf die AdoDB von CG aufsetzen, dann könnte ich es mal testen ob das Problem dort auch auftritt? Allerdings müßen Die Komponenten dann ggf. Kompatible zu D2009 sein. |
Re: Vista Suche in Delphi nutzen
Hallo,
Du könntest eventuell die Typlib der Suche importieren und dann alles "von Hand" machen. Bin mir nicht sicher, ob dashier C:\Programme\Gemeinsame Dateien\System\ado\msadox.dll die richtige ist. Eventuell kann Dir ![]() Dashier ![]() Irgendwas zu diesem Thema, im Zusammenhang mit Delphi, habe ich nicht finden können. Ansonsten: Schau mal hier: ![]() |
Re: Vista Suche in Delphi nutzen
Zitat:
Da ich jetzt allmählich die Sch.... voll hab mit dem Ding hier rum zu eiern, hab ich grad die AdoDB_TLB auch noch importiert und muß sagen ich hatte wohl recht. CG Ado Komponenten scheinen das Problem zu sein! Suchstring = *.exe Rückgabe = file:g:/SysinternalsSuite/Diskmon.exe;.exe;file:g:/SysinternalsSuite/DiskView.exe;.exe; Also es kommt schon mal endlich etwas zurück, jetzt werd ich mich da wohl einarbeiten müssen weil: G:\ ist zur Zeit nicht angeschlossen, sieht also so aus als wenn er alles zurückliefert was indiziert wurde bisher. Verzeichniswechsel für eine Live Suche hat noch nicht funktioniert also so etwas in etwa: Suchstring = D:\*.exe Naja mal sehen wenn ich das noch hinbekomme ist es wohl geschafft :-) Viele Grüße Marc |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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