Руководство программиста MBD Search Engine

реклама
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
Скачать