Реализация функций контроля и управления на базе Win32 API: Методические указания по выполнению лабораторного практикума, страница 22

// поиск слов и преобразование в 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()); // ключевое слово