/** * @file * @brief Windows Search command-line client Visual C++ port * @author AKIYAMA Kouhei * @since 2010-07-01 * * Original python script is: * http://www.carcosa.net/jason/software/utilities/desktopsearch/ (Jason F. McBrayer) * */ #import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "ADO_EOF") #include #include #include #include #include #include #include #include #include typedef ADODB::_ConnectionPtr ADOConnectionPtr; typedef ADODB::_RecordsetPtr ADORecordsetPtr; //typedef ADODB::ErrorPtr ADOErrorPtr; //typedef ADODB::_CommandPtr ADOCommandPtr; //typedef ADODB::_ParameterPtr ADOParameterPtr; //typedef ADODB::FieldPtr ADOFieldPtr; template HRESULT CreateADOObj(PTR &p) { return p.CreateInstance(__uuidof(CLS)); }; // main int _tmain(int argc, TCHAR *argv[]) { if(argc <= 1){ _tprintf(_T("winsearch keyword...\n")); return -1; } // set locale setlocale(LC_ALL, ""); // initialize COM ::CoInitialize(NULL); // create query typedef std::wstring StdStr; StdStr query_names; StdStr query_contains; for(int ai = 1; ai < argc; ++ai){ if(ai > 1){ query_names += _T(" AND "); query_contains += _T(" AND "); } query_names += _T("System.FileName Like '%") + StdStr(argv[ai]) + _T("%'"); ///@todo escape query_contains += _T("Contains('\"") + StdStr(argv[ai]) + _T("\"')"); ///@todo escape } StdStr query = _T("SELECT System.FileName, System.ItemFolderPathDisplay FROM SYSTEMINDEX WHERE (") + query_names + _T(" ) OR ( ") + query_contains + _T(" )"); // search ADOConnectionPtr conn; ADORecordsetPtr recordset; try{ if(CreateADOObj(conn) == S_OK){ // open conn->Open( _T("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"), _T(""), //UserID _T(""), //Password NULL); // execute recordset = conn->Execute(query.c_str(), NULL, ADODB::adCmdText); // enumerate static const CComVariant FIELDNAME_PATH = _T("System.ItemFolderPathDisplay"); static const CComVariant FIELDNAME_FILENAME = _T("System.FileName"); if(! (recordset->GetBOF() && recordset->GetADO_EOF()) ){ static const int MAX_COUNT = 30; ///@todo recordset->MoveFirst(); int count = 0; while( ! recordset->ADO_EOF && count < MAX_COUNT){ _tprintf(_T("%s\\%s\n"), (recordset->Fields->GetItem(FIELDNAME_PATH )->GetValue()).bstrVal, (recordset->Fields->GetItem(FIELDNAME_FILENAME)->GetValue()).bstrVal ); recordset->MoveNext(); ++count; } } } }catch(_com_error &e){ _tprintf(_T("Error(0x%08x):%s\n"), e.Error() , (LPWSTR)e.Description()); } // close if(conn && conn->State != ADODB::adStateClosed){ conn->Close(); } ::CoUninitialize(); return 0; }