MBD Search Engine 2.1 Руководство программиста © МБД Софт 2008 Оглавление ОГЛАВЛЕНИЕ .......................................................................................................................................................... 2 ВВЕДЕНИЕ ................................................................................................................................................................. 3 МЕТОДИКА МОДИФИКАЦИИ МОДУЛЯ TXTRTVER.DLL ........................................................................ 4 ПЕРЕПРОГРАММИРОВАНИЕ ЗАГРУЗКИ ДОКУМЕНТА ............................................................................ 6 ИСПОЛЬЗОВАНИЕ СОБСТВЕННЫХ ХРАНИЛИЩ ДОКУМЕНТОВ ........................................................ 8 ФУНКЦИЯ FINDFIRSTFILEADV ................................................................................................................................. 8 ФУНКЦИЯ FINDNEXTFILEADV ................................................................................................................................. 9 ФУНКЦИЯ FINDCLOSEADV ....................................................................................................................................... 9 ФУНКЦИЯ READFILETOBUFFERFROMFF ............................................................................................................... 10 ФУНКЦИЯ READFILETOBUFFERADV ...................................................................................................................... 11 ФУНКЦИЯ OPENFILEINEDITOR ............................................................................................................................... 12 РЕЗУЛЬТАТЫ ........................................................................................................................................................... 12 ИЗВЛЕЧЕНИЕ ТЕКСТА ИЗ ФАЙЛОВ СОБСТВЕННОГО ФОРМАТА ..................................................... 13 ФУНКЦИЯ GETCAPABILITIES .................................................................................................................................. 13 ФУНКЦИЯ GETDOCTYPES....................................................................................................................................... 13 ФУНКЦИЯ RETRIEVETEXT ...................................................................................................................................... 14 РЕЗУЛЬТАТЫ ........................................................................................................................................................... 15 ПРИЛОЖЕНИЕ А ................................................................................................................................................... 16 ПРИЛОЖЕНИЕ Б ................................................................................................................................................... 21 Введение MBD Search Engine является программируемым ПО с возможностью расширения функции извлечения текста из источников и функции просмотра документов. Таким образом, возможна обработка любых текстосодержащих источников в том числе: баз данных любого формата, архивов и любых документов, не поддерживаемых программой форматов (включая собственные форматы) и т.п. Для расширения MBD Search Engine необходимо программно расширить модуль занесения txtrtver.dll. Для этого необходимо создать новый модуль txtrtver.dll, а старый сохранить под другим именем в той же директории. Например, под именем txtrtver.old. Вместе с руководством программиста поставляется пример подобной модификации – проект mytxtrtver. Проект может быть скачан с официального сайта МБД Софт: www.mbdsoft.ru. Данный проект предназначен для Microsoft Visual C++ 7.0 и выше с поддержкой MFC. Скомпилирован под Microsoft Visual C++ 7.0. Для собственных разработок настоятельно рекомендуем использовать этот проект как образец. Весь представленный ниже материал гарантированно работает под Microsoft Visual C++. Работа на других компиляторах не гарантирована. Требование к разработчикам: знание языка C на хорошем уровне, владение Microsoft Visual C++ 7.0 и навыками низкоуровневого программирования под Windows. Методика модификации модуля txtrtver.dll Включите файл txtrtver.h (см. Приложение) в проект. В функции DllMain ввести подключение старой библиотеки и загрузить старые функции HINSTANCE oldDLL = NULL; // holder for old txtrtver.dll // Old functions holders RetrieveTextFunc Old_RetrieveText = NULL; GetCapabilitiesFunc Old_GetCapabilities = NULL; // ... BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID vReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // Loading old library oldDLL = LoadLibrary (“txtrtver.old”); // restoring old functions Old_RetrieveText = GetProcAddress(oldDLL,”RetrieveText”); Old_GetCapabilities = GetProcAddress(oldDLL,” GetCapabilitie”); // ... break; case DLL_PROCESS_DETACH: FreeLibrary (oldDLL); oldDLL = 0; break; } } Далее, объявить новые функции как extern “C”: extern "C" { DWORD RetrieveText(RETRECORD *Ret,DWORD Flags); DWORD GetCapabilities(char **strExts); DWORD GetDocTypes(DWORD **Types,DWORD *str,DWORD *Bmp); BOOL ReadFileToBufferAdv(LPCTSTR FileName,void *mem,DWORD &sz); BOOL FindCloseAdv(HANDLE hFF); BOOL FindNextFileAdv(HANDLE hFF,WIN32_FIND_DATA *fd); HANDLE FindFirstFileAdv(LPCTSTR Path,WIN32_FIND_DATA *fd); BOOL ReadFileToBufferFromFF(HANDLE hFF,void *mem,DWORD sz); BOOL OpenFileInEditor(LPCTSTR m_FullPath,LPCTSTR FoundWords); } и раскрыть все функции, вызвав в них старые после выполнения своего кода: DWORD RetrieveText(RETRECORD *Ret,DWORD Flags); { // your code here // ... if (Old_RetrieveText) return (Old_RetrieveText(Ret,Flags)); return(0); } DWORD GetCapabilities(char **strExts) { // your code here // ... if (Old_ GetCapabilities) return (Old_GetCapabilities); return (0); } // ... Вставка собственного кода зависит от типа модификации продукта MBD Search Engine. Важным для правильной работы системы является занесение в модуль txtrtver.dll всех ресурсов модуля txtrtver.old. Для этого можно воспользоваться файлами resource.h и txtrtver.rc листинги которых представлены в Приложении А. В библиотеке txtrtver.dll присутствует один битмэр номер 101, вид которого представлен в Приложении Б. Необходимо извлечь этот рисунок из txtrtver.old с помощью программы просмотра ресурсов (например, Resource Hacker) и поместить его в новую библиотеку. ОБРАЩАЕМ ВАШЕ ВНИМАНИЕ НА ТО, ЧТО СОГЛАСНО ПЕРСОНАЛЬНОЙ ЛИЦЕНЗИИ ВЫ НЕ МОЖЕТЕ РАСПРОСТРАНЯТЬ МОДИФИЦИРОВАННЫЙ ПРОДУКТ MBD SEARCH ENGINE, НЕ ГОВОРЯ УЖЕ О ПОСТРОЕНИИ КОММЕРЧЕСКИХ ПРОДУКТОВ НА ЕГО БАЗЕ. ДЛЯ ЭТОГО НЕОБХОДИМО ПОЛУЧИТЬ СООТВЕТСТВУЮЩУЮ ЛИЦЕНЗИЮ У ФИРМЫ МБД СОФТ. Перепрограммирование загрузки документа Пожалуй, самой простой задачей является переопределение функции загрузки документа. Это функция OpenFileInEditor. Ее прототип: BOOL OpenFileInEditor(LPCTSTR m_FullPath,LPCTSTR FoundWords); m_FullPath – полный путь к документу FoundWords – найденные слова (можно выделить) Если вы хотите полностью переопределить функцию OpenFileInEditor, следует иметь в виду, что файл может физически и не присутствовать на диске. Он может располагаться и в zip - архиве и в виртуальной папке и в вашем источнике. Для его считывания следует использовать функцию ReadFileToBufferAdv, предварительно проверив, нет ли его физически. Пример реализации стандартной функции загрузки документа приведен ниже: BOOL OpenFileInEditor(LPCTSTR m_FullPath,LPCTSTR FoundWords) { WIN32_FIND_DATA fd; HANDLE hFF = FindFirstFile(m_FullPath,&fd); if (hFF!=INVALID_HANDLE_VALUE) { FindClose(hFF); ShellExecute(NULL,"open",m_FullPath,0,0,SW_SHOW); } else { DWORD sz =0; if (ReadFileToBufferAdv(m_FullPath,0,sz)) { void *mem = GlobalAlloc (GPTR,sz); if (ReadFileToBufferAdv(m_FullPath,mem,sz)) { char Temp[MAX_PATH]; GetTempPath(MAX_PATH,Temp); CreateDirectory(CString(Temp)+"PMMBD",0); CString m_FileName = CString(m_FullPath).Mid(max(CString(m_FullPath).ReverseFind('\\'),CString(m_F ullPath).ReverseFind('/'))+1); CString FileName = CString(Temp)+CString("PMMBD\\")+m_FileName;//CString("pmmbddoc")+strrchr(m_F ileName,'.'); CString s; s.LoadString(IDS_I_DOCCOPY); FileName.Insert(FileName.ReverseFind('.'),s); HANDLE hFile = CreateFile (FileName, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,0,CREATE_ALWAYS,0,0); if (hFile!=INVALID_HANDLE_VALUE) { DWORD dw = 0; WriteFile (hFile,mem,sz-1,&dw,0); CloseHandle(hFile); ShellExecute(NULL,"open",FileName,0,0,SW_SHOW);// Default viewer } } GlobalFree (mem); }//not found return (TRUE); } Использование собственных хранилищ документов Если вам необходимо извлечь информацию в виде файлов расположенных на нестандартных источниках (базах данных, архивах, программах, почтовых ящиках, виртуальных хранилищах), при этом сами документы являются файлами, поддерживаемыми MBD SE Пример: Базу данных или SQL запрос можно представить в в виде источника одного или нескольких текстовых файлов. В этом случае следует модифицировать функции FindCloseAdv, FindNextFileAdv, FindFirstFileAdv, ReadFileToBufferAdv, ReadFileToBufferFromFF, OpenFileInEditor. Функция FindFirstFileAdv Прототип функции HANDLE FindFirstFileAdv(LPCTSTR Path,WIN32_FIND_DATA *fd); На вход поступает параметр Path – который является путем в источнику файлов (директории на диске, почтовому ящику, архиву и т.п.). На выход – fd, описывающая первый файл из источника. Возвращаемое значение – это идентификационный номер сеанса поиска, который потом будет передан в функции FindCloseAdv и FindNextFileAdv. Функция FindFirstFileAdv заводит таблицу с необходимыми параметрами сеанса, а номер записи в этой таблице + 0x1000 и является возвращаемый параметр. struct _FFFA { HANDLE Handle; // FFFA Handles DWORD Params; // Their params int Count; // Count int Number; // Number of files char LastFileName[MAX_PATH+1]; // char RootPath[MAX_PATH+1]; }*_LPFFFA = 0; int nFFFA =0; // Their qauntity Таким образом, идентификатор сеанса может принимать значения от 0х1000 до 0хFFFFFFFF. Максимальное значение идентификатора соответствует степени вложенности директорий. Т.к. вложенность вряд ли может достигать значения 0х80000000, можно использовать это число как флаг означающий использован ли ваша таблица или стандартная таблица MBD SE. В функции FindFirstFileAdv вам нужно определить является ли путь Path вашим виртуальным источником или нет. Для того, чтобы отделить собственный виртуальный путь удобно в качестве пути указывать <модификатор>:\ , где <модификатор> - любое ангийское слово, означающее ваш источник. Зарезервированы следующие значения модификатора: a-z,A – Z – диски, mail – почта Outlook. Предположим, вы успользуете модификатор myplace. Тогда при создании вы указываете путь для создания myplace:\Folder, где Folder – это дополнительный параметр, играющий роль пути. Например, если ваш источник – это базы данных, то Folder может являться именем базы данных, а Folder\SubFolder может означать таблицу SubFolder и базе данных Folder. Путь, естественно, может содержать пробелы. Несколько путей отделяются друг от друга точкой с запятой “;”. Можно осуществить следующий разбор в теле функции: HANDLE FindFirstFileAdv(LPCTSTR Path,WIN32_FIND_DATA *fd) { if (strcnmp(Path,”myplace:\\”)) { return (0x80000000|AddMyHandle(Path+9,fd)); } return (Old_FindFirstFileAdv(Path,fd)); } Ваша задача завести таблицу структур, аналогичных _FFFA и сохранять (в функции AddMyHandle) в нее все требуемые параметры. Можно хранить и список всех файлов. В этом случае необходимо также хранить номер последнего прочитанного файла, для вызова функции FindNextFileAdv. Функция FindNextFileAdv Функция FindNextFileAdv выдает параметры следующего файла в сеансе поиска. Прототип функции: BOOL FindNextFileAdv(HANDLE hFF,WIN32_FIND_DATA *fd) На вход подается идентификатор сеанса поиска. На выход – fd – описание файла или директории. Возврат TRUE – если есть чего выдать, FALSE – если файлов уже нет. Здесь вы должны определить ваш ли идентификатор сеанса и если ваш, выдать параметры следующего файла: BOOL FindNextFileAdv(HANDLE hFF,WIN32_FIND_DATA *fd) { if (hFF&0x80000000) { return (MyGetNextFile(hFF&~0x80000000,fd)); } return (Old_FindNextFileAdv(hFF,fd)); } В данном случае в функции MyGetNextFile вы должны выдать следующий файл (или директорию) и увеличить счетчик текущего файла на единицу. Если файлы закончились – верните FALSE. Функция FindCloseAdv Эта функция завершает сеанс поиска. Здесь вы можете освободить все свои данные. BOOL FindCloseAdv(HANDLE hFF) { if (hFF&0x80000000) { return (MyFreeData(hFF&~0x80000000)); } return (Old_FindCloseAdv(hFF)); } Функция ReadFileToBufferFromFF Функция ReadFileToBufferFromFF нужна для считывания содержимого последнего из перечисленных в сеансе поиска файла при создании базы. Прототип функции: BOOL ReadFileToBufferFromFF(HANDLE hFF,void *mem,DWORD sz) где hFF – это идентификатор сеанса поиска, mem – это выделенная память для занесения содержимого, а sz – это размер выделенной памяти. Для извлечения текста из собственных источников необходимо модифицировать данную функцию. Однако эта функция вызывается из других функций библиотеки txtrtver.old, поэтому модифицированная функция из библиотеки txtrtver.dll просто не будет вызвана. Для устранения данной проблемы необходимо прибегнуть к динамической модификации кода функции ReadFileToBufferFromFF в модуле txtrtver.old. Смысл модификации – поместить ссылку на новую функцию ReadFileToBufferFromFF из старой, при этом при возврате сохранить стек в исходном состоянии. В данном документе описывается методика работающая с компилятором Microsoft Visual C++. Работа примера на других компиляторах не гарантируется. Функция ReadFileToBufferFromFF (как и любая функция в С++) начинается с выделения статических переменных и сохранения стекового регистра: команды i486+ 55 8B EC 81 EC dw ASM Комментарий push ebp mov ebp, esp sub esp,dw сохраняем стековый регистр dw – размер статических переменных Вместо этих строчек можно написать JMP на новую функцию ReadFileToBufferFromFF. Удобно воспользоваться командой E9 dw, где dw - четырехбайтовое смещение относительно конца команды. Комманад E9 занимает 5 байт. Остальные 4 байта лучше забить NOP-ами (пустыми операторами) с кодом 90. Чтобы запомнить размер статических переменных введем глобальную переменную DWORD Old_ReadFileToBufferFromFF_Sub_DW =0; Реализовать указанный способ можно следующим образом (в DllMain после извлечения указателей старых функций): Old_ReadFileToBufferFromFF = (ReadFileToBufferFromFFFunc) GetProcAddress(oldDLL,"ReadFileToBufferFromFF"); //... // now change the beginning of Old_ReadFileToBufferFromFF BYTE *cms = (BYTE *)Old_ReadFileToBufferFromFF; if (cms) { // cms must start with 55 8B EC 81 EC XX XX XX XX // push ebp; mov ebp,esp; sub esp, xxxxxxxxh if ((cms[0]==0x55) && (cms[1]==0x8B) && (cms[2]==0xEC) && (cms[3]==0x81) && (cms[4]==0xEC)) { DWORD dw=0, dw1 =0; // removing memory protection VirtualProtect(cms,10,PAGE_READWRITE,&dw); Old_ReadFileToBufferFromFF_Sub_DW = *(DWORD *)(cms+5); // holder for sub param // write jmp ReadFileToBufferFromFF; cms[0] = 0xE9; *(DWORD *)(cms+1) = ((DWORD)ReadFileToBufferFromFF)((DWORD)Old_ReadFileToBufferFromFF)-5; memset (cms+5,0x90,4);// writing NOPs // restoring memory protection VirtualProtect(cms,10,dw,&dw1); } else { FreeLibrary (oldDLL); return (FALSE); } } Далее, в новой функции ReadFileToBufferFromFF, после выполнения своего кода необходимо вместо возврата передать управление старой функции, при этом, выполнив первые три строчки кода, которые были заменены. Ниже – пример реализации. BOOL ReadFileToBufferFromFF(HANDLE hFF,void *mem,DWORD sz) { if (hFF&0x80000000) { return (MyReadData(hFF&~0x80000000,mem,sz)); } if (Old_ReadFileToBufferFromFF) { __asm { // standard end pop edi pop esi pop ebx mov pop esp,ebp ebp // standard start of Old_ReadFileToBufferFrom push ebp; mov ebp,esp; mov eax,Old_ReadFileToBufferFromFF_Sub_DW sub esp,eax // jump back to Old_ReadFileToBufferFromFF+9 mov eax, Old_ReadFileToBufferFromFF add eax, 9 jmp eax } } Функция ReadFileToBufferAdv Функция ReadFileToBufferAdv нужна только для внутреннего использования. Для совместимости со следующими версиями MBD Search Engine рекомендуем все же поместить в тело вызов старой функции: BOOL ReadFileToBufferAdv(LPCTSTR FileName,void *mem,DWORD &sz) { return (Old_ReadFileToBufferAdv (FileName,mem,sz)); } Функция OpenFileInEditor Функция OpenFileInEditor нужна для отображения документа в собственном редакторе или просмотровщике. Прототип: BOOL OpenFileInEditor(LPCTSTR m_FullPath,LPCTSTR FoundWords); m_FullPath – полный путь к документу FoundWords – найденные слова (можно выделить) Необходимо переопределить функцию аналогично FindFirstFileAdv HANDLE OpenFileInEditor(LPCTSTR m_FullPath,LPCTSTR FoundWords) { if (strcnmp(FullPath,”myplace:\\”)) { return (0x80000000|MyOpenInEditor(Path+9,FoundWords)); } return (Old_OpenFileInEditor (FullPath,FoundWords)); } Результаты После компиляции проекта mytxtrtver необходимо закрыть MBD Search Engine, скопировать mytxtrtver.dll в txtrtver.dll, расположенной в директории программы MBD Search Engine, а исходную копию txtrtver.dll сохранить в файле txtrtver.old. Теперь можно запускать MBD Search Engine и создавать базу данных по файлам из собственного источника. Для этого в окне пути к файлам просто введите “myplace:\”. Можно скомбинировать их со стандартными файлами: В результате в процессе создания будут обработаны файлы вашего источника myplace:\ и при поиске по слову sample, которое входит во все файлы будет выдано что-то вроде этого: При загрузке документа он должен открываться в собственном редакторе т.к. мы переопределили функцию OpenInEditor. Извлечение текста из файлов собственного формата Если файлы необходимого вам формата не поддерживаются или обрабатываются не должным образом, вы можете изменить эту обработку. Рассмотрим случай добавления в обработку файлов собственного формата, а именно – файлов C++. Данный пример реализован в проекте mytxtrtver. Прежде всего необходимо зарезервировать номер собственного формата. Это должен быть уникальный номер. Для пользовательских форматов зарезервированы номера от 60000 до 61000. Для каждого из этих форматов может быть указано несколько расширений файлов. Пусть в нашем случае номер формата 60001. Определим его константой. #define MYTYPE 60001 Далее необходимо изменить рисунок под номером 101 (Приложение Б). Для каждого формата выделяется область 20х20 пикселей. Следующий шаг – модификация строки описания форматов. По умолчанию ее идентификатор равен 1. Можно либо изменить строку под номером 1 в ресурсе, либо добавить новую, как это сделано в примере. Форматы перечислены через символ | , при этом этим же символом отделены описания от расширений. Расширение перечисляются через запятую с использованием символа * впереди. Пример строки: Text documents (TXT)|*.txt|\nRich Text (RTF)|*.rtf|\nMicrosoft Word Documents|*.doc|\nHTML documents|*.html,*.htm|\nPDF Documents|*.pdf|\nZip Archives|*.zip|\nC++ files|*.cpp,*.h|\n Далее необходимо изменить некоторые функции Функция GetCapabilities Функция GetCapabilities возвращает указатель на список всех возможных расширений, перечисленных через запятую. Вам нужно просто добавить свое: // holder for caps string char Caps[200]=""; DWORD GetCapabilities(char **strExts) { if (Old_GetCapabilities) { DWORD dw = Old_GetCapabilities(strExts); strcpy (Caps,*strExts); strcat (Caps,",cpp,h"); *strExts = Caps; } return(0); } Функция GetDocTypes Функция GetDocTypes возвращает структурированную информацию о поддерживаемых типах документов. Ее прототип: DWORD GetDocTypes(DWORD **Types,DWORD *str,DWORD *Bmp) где Types – указатель на выделенную функцией GlobalAlloc с параметром GMEM_FIXED память со списком номеров типов форматов. Каждый формат имеет уникальный номер. Наша задача добавить свой (MYTYPE) в конец списка. str – это возвращаемое значение – номер строки ресурса в которой прописаны текстовые описания форматов. Мы должны подсунуть свой номер. Bmp – это возвращаемое значение - номер рисунка с форматами. В проекте mytxtrtver номер рисунка остался прежним, поменялся сам рисунок. Возвращает функция количество форматов. Наша задача вернуть на единицу больше. Пример реализации: DWORD GetDocTypes(DWORD **Types,DWORD *str,DWORD *Bmp) { if (Old_GetDocTypes) { int n = Old_GetDocTypes(Types,str,Bmp); // Insert your code to add new doc types // Types is allocated to 100 types with GlobalAlloc(GMEM_FIXED) // If it's not enough just reallocate memory (*Types)[6] = MYTYPE; // CPP *str = IDS_NEWTYPES; // New types string return (n+1); } return(0); } Функция RetrieveText Это основная функция извлечения текста. В качестве параметра ей передается структура, часть полей которой заполнена, часть нужно заполнить и флаги (константы FLAGS_CHECK_xxx). Прототип функции DWORD RetrieveText(RETRECORD *Ret,DWORD Flags) Имя файла передается в поле Ret->FileName. Поле Ret-> TextBuffer уже выделен размером в Ret->Size. Необходимо заполнить поле Ret->Type номером своего формата и вернуть 0, если все в порядке. В противном случае нужно вернуть не ноль. Пример реализации в котором файлы cpp и h просто считываются безо всякой обработки. Вообще необходимо еще учитывать и флаги Flags. DWORD RetrieveText(RETRECORD *Ret,DWORD Flags) { // your code here char *ext =strrchr (Ret->FileName,'.'); if (ext) { if ((strcmpi(ext+1,"cpp")==0) || (strcmpi(ext+1,"h")==0)) { // This is my file // It's important to set file's type Ret->Type = MYTYPE; // Just read it if (ReadFileToBufferFromFF(Ret->hFF,Ret->TextBuffer,Ret->Size)) { DWORD sz = Ret->Size; Ret->TextBuffer[sz]=0; Ret->nUserParams =0; return (0); } else { return (2); } return (1); } } if (Old_RetrieveText) return (Old_RetrieveText(Ret,Flags)); return(0); } Результаты В результате работы примера при создании базы вам будут предложено проиндексировать Файлы C++. В итоге будет возможен поиск по cpp файлам, как это показано на рисунке ниже. Приложение А // File txtrtver.h typedef struct _tagRETRECORD { DWORD dwSize; // size of this structure char FileName[MAX_PATH]; DWORD Type; DWORD Size; char *TextBuffer; // v 1.1 char Title[256]; struct { char Name[32]; char Value[MAX_PATH]; }UserParams[32]; int nUserParams; // for data holding void *pMBDFlat; int IDA; // v 1.3 HANDLE hFF; // For rapid reading directly }RETRECORD, FAR *LPRETRECORD; typedef struct { char Ext[20]; char ExtentionHint[128]; }EXTENSION; typedef DWORD ( *RetrieveTextFunc)(LPRETRECORD,DWORD); typedef DWORD ( *GetCapabilitiesFunc)(char **); typedef DWORD ( *GetDocTypesFunc)(DWORD **numb,DWORD *bmp,DWORD *str); typedef BOOL ( *ReadFileToBufferAdvFunc)(LPCTSTR FileName,void *mem,DWORD &sz); typedef BOOL (*ReadFileToBufferFromFFFunc)(HANDLE hFF,void *mem,DWORD sz); typedef BOOL ( *FindCloseAdvFunc)(HANDLE hFF); typedef BOOL ( *FindNextFileAdvFunc)(HANDLE hFF,WIN32_FIND_DATA *fd); typedef HANDLE ( *FindFirstFileAdvFunc)(LPCTSTR Path,WIN32_FIND_DATA *fd); typedef BOOL (*OpenFileInEditorFunc)(LPCTSTR m_FullPath,LPCTSTR FoundWords); #define FLAG_CHECK_LANGUAGE 0x1000 #define FLAG_CHECK_BREAKS 0x2000 #define FLAG_CHECK_CODEPAGE 0x4000 // Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Neutral resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) #ifdef _WIN32 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1251) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDB_BITMAP1 BITMAP "Ext.bmp" ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 2,0,0,3 PRODUCTVERSION 2,0,0,3 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x2L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "041904b0" BEGIN VALUE "Comments", "MBDSE component" VALUE "CompanyName", "MBDSoft" VALUE "FileDescription", "txtrtver" VALUE "FileVersion", "2, 0, 0, 3" VALUE "InternalName", "txtrtver" VALUE "LegalCopyright", "Copyright (C) ООО ""МБД Софт"" (Москва) 2007" VALUE "OriginalFilename", "txtrtver.dll" VALUE "ProductName", "MBDSE txtrtver" VALUE "ProductVersion", "2, 0, 0, 3" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x419, 1200 END END #endif // Neutral resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Russian resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS) #ifdef _WIN32 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT #pragma code_page(1251) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE BEGIN ID_TYPES "Текстовые (TXT)|*.txt|\nRich Text (RTF)|*.rtf|\nДокументы Word (DOC)|*.doc|\nСтраницы HTML|*.html,*.htm|\nДокументы PDF|*.pdf|\nАрхивы Zip|*.zip|\nПрезентации PowerPoint|*.ppt|\nФайлы Excel|*.xls|\n" IDS_MAIL_REC_HEADER "Письмо ""%s""\nОт: %s\nПолучено: %s\nКем: %s\nПапка: %s\n\n******\n" IDS_I_DOCCOPY "[Копия]" IDS_MAIL_REC_FILENAME "%d. ""%s"" от %s (%s)" IDS_MAIL_SEND_FILENAME "%d. ""%s"" %s (%s)" IDS_MAIL_SEND_HEADER "Письмо ""%s""\nКому: %s\nНаписано: %s\nКем: %s\nПапка: %s\n\n******\n" END #endif // Russian resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE BEGIN ID_TYPES "Text documents (TXT)|*.txt|\nRich Text (RTF)|*.rtf|\nMicrosoft Word Documents|*.doc|\nHTML documents|*.html,*.htm|\nPDF Documents|*.pdf|\nZip Archives|*.zip|\nPowerPoint presentations|*.ppt|\n" IDS_MAIL_REC_HEADER "Letter ""%s""\nFrom: %s\nReceived: %s\nBy: %s\nFolder: %s\n\n******\n" IDS_I_DOCCOPY "[Copy]" IDS_MAIL_REC_FILENAME "%d. ""%s"" from %s (%s)" IDS_MAIL_SEND_FILENAME "%d. ""%s"" to %s (%s)" IDS_MAIL_SEND_HEADER "Letter ""%s""\nTo: %s\nWritten: %s\nBy: %s\nFolder: %s\n\n******\n" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED // resource.h //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by txtrtver.rc // #define ID_TYPES 1 #define IDS_MAIL_HEADER 2 #define IDS_MAIL_REC_HEADER 2 #define IDS_I_DOCCOPY 3 #define IDS_MAIL_REC_FILENAME 4 #define IDS_MAIL_SEND_FILENAME 5 #define IDS_MAIL_SEND_HEADER 6 #define IDB_BITMAP1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE #define _APS_NEXT_CONTROL_VALUE #define _APS_NEXT_SYMED_VALUE #endif #endif 40001 1000 101 ; txtrtver.def : Declares the module parameters for the DLL. LIBRARY "txtrtver" EXPORTS ; Explicit exports can go here RetrieveText @1 GetCapabilities @2 GetDocTypes @3 ReadFileToBufferAdv @7 FindCloseAdv @6 FindNextFileAdv @5 FindFirstFileAdv @4 ReadFileToBufferFromFF @8 OpenFileInEditor @9 Приложение Б Ext.bmp