// поиск слов и преобразование в RTF
{
char *ptr, *buf, str[64], FileName[16]="123.rtf";
int count=0, handle;
handle = open(FileName, O_BINARY|O_RDWR );
if(handle == -1)
return -1;
buf = new char [2*filelength(handle)];
memset(buf, 0, 2*filelength(handle));
read(handle, str, 64);
read(handle, buf, filelength(handle)-64);
close(handle);
ptr=strstr(buf,str);
// цикл поиска
while(ptr != NULL)
{
count++; // увеличить счетчик
RtfIns((int)(ptr-buf),buf,TXTCOLOR); // начало подсветки
RtfIns((int)(ptr-buf)+strlen(str)+sizeof(TXTCOLOR)-1,buf,TXTNOCOLOR); // конец подсветки
ptr=ptr+strlen(str)+sizeof(TXTCOLOR)+sizeof(TXTNOCOLOR); // смещение указателя
ptr=strstr(ptr,str);
}
// замена ВК и ПС
ptr=strstr(buf,TXTCR);
while(ptr != NULL)
{// замена ВК и ПС на конец абзаца
RtfDel((int)(ptr-buf),buf,sizeof(TXTCR));
RtfIns((int)(ptr-buf),buf,TXTPAR);
ptr=strstr(buf,TXTCR);
}
RtfIns(0,buf,TXTSTART); // вставка заголовка RTF
RtfIns(sizeof(TXTSTART)-1,buf,TXTNOCOLOR); // установка исходного цвета
strcat(buf,TXTEND); // добавить концовку RTF
strcat(buf,"\0\0\0"); // добавить концовку
handle = open(FileName, O_CREAT|O_TRUNC|O_BINARY|O_RDWR );
if(handle == -1)
return -1;
write(handle, buf, strlen(buf));
close(handle);
delete buf;
return count;
}
16. Выполнить перенос функций RtfIns(),RtfDel() из проекта ЕХЕ-файла в проект DLL-модуля. Выполнить перенос констант RTF-формата из проекта ЕХЕ-файла в проект DLL-модуля.
17. В заголовочном файле <unit_d>.h ввести описание экспортируемой функции. Пример приведен ниже.
//---------------------------------------------------------------------------
#ifndef MainLab2dH
#define MainLab2dH
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
// константы RTF формата
#define TXTCOLOR "\\plain\\fs20\\cf1 " // начало подсветки
#define TXTNOCOLOR "\\plain\\fs20 " // конец подсветки
#define TXTSTART "{\\rtf1\\ansi\\deff0\\deftab720{\\fonttbl{\\f0\\fmodern Courier}}\r\n{\\colortbl\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\r\n"
// начало
#define TXTEND "}\\par" // конец
#define TXTPAR "\\par " // конец абзаца
#define TXTCR "\r\n" // перевод строки
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) int SearchConRTF(void);
void __fastcall RtfDel(int n, char *txtbuf, int size);
void __fastcall RtfIns(int n, char *txtbuf, char *str);
#endif
18. В опциях проекта Project|Options… в окне Advanced Compiler опцию Calling Convention установить в состояние Standart Call.
19. Выполнить компиляцию проекта. В результате компиляции будут сгенерированы два файла - <user_d>.dll(DLL-модуль) и <user_d>.lib (файл, который содержит список функций данной DLL).
20. Вызвать проект ЕХЕ-файла. Из проекта удалить функции RtfIns(),RtfDel() и константы RTF-формата.
21. В процедуре реакции на событие нажатия кнопки "Поиск" установить динамический вызов функции из DLL-модуля. Пример процедуры приведен ниже.
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
// поиск ключевого слова и преобразование в RTF
{
char *buf;
char str[64];
int count=0;
char FileName[16]="123.rtf";
int handle;
typedef int (__fastcall *DLLPROC)(void);
HANDLE hLib;
buf = new char [2*RichEdit1->Lines->Text.Length()];
memset(buf, 0, 2*RichEdit1->Lines->Text.Length()- 1);
// чтение в буфер
strcpy(buf,RichEdit1->Lines->Text.c_str());
strcpy(str,Edit1->Text.c_str()); // ключевое слово
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.