title
Total Commander
 



Total Commander

Листер плагин на Borland C++ Builder 6 для начинающих

Автор: Evgeniy Savich

Не боги горшки обжигают…

Наверное, данная статья является не учебным пособием, а попыткой обобщить опыт, полученный автором в процессе разработки плагина xBaseView на Delphi 7, когда пришлось столкнуться с про-блемами, довольно неприятными программисту, привыкшему мощной поддержке VCL среды.

Задача: создать плагин для просмотра RTF файлов.

Создаем проект DLL библиотеки и сохраняем его под именем ListSimpleBcb.bpr в отдельной папке, изменим расширение имени плагина на WLX в опциях проекта.

Модуль Unit1.cpp сохраняем под именем ListSimple.cpp.

Плагин должен экспортировать из библиотеки три функции:

ListGetDetectString,
ListLoad,
ListCloseWindow.

ListGetDetectString должна записать в параметр DetectString строку, которая содержит RTF.

ListLoad вызывает плагин для работы и передает параметры:

ListerWin - дескриптор окна Листера;
FileToLoad - полное имя RTF файла.

Плагин должен создать свое окно в качестве дочерней по отношению к окну Листера и вернуть дескриптор этого окна. Эту инициализацию мы будем осуществлять в функции ShowRTF:

HWND ShowRTF(HWND ListerWin, char* FileToLoad);

ListCloseWindow требует от плагина завершения работы, передавая дескриптор окна плагина. Это освобождение ресурсов мы будем делать в функции HideRTF:

void HideRTF(HWND PluginWin);

Надо добавить в проект форму, изменить ее имя на fmMain и сохранить модуль формы под именем unMain.cpp. Эта форма и есть окно плагина.

В заголовочный файл unMain.h надо добавить определения двух вышеприведенных функции и уда-лить бесполезную глобальную переменную:

extern PACKAGE TfmMain *fmMain;

Замечание: ПЛАГИН НЕ ДОЛЖЕН ИСПОЛЬЗОВАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ!

Бросив на форму компонент RichEdit, надо установить ему такие свойства:

Align = alClient,
ReadOnly = True,
ScrollBars = ssBoth.

Объект RichEdit1 обеспечивает всю работу с RTF файлом.

В плагинах часто используется контекстное меню, поэтому надо бросить на форму компонент PopupMenu и создать два пункта меню Help и About, назначив им клавиши F1 и F2, соответственно. Необходимо прикрепить контекстное меню объекту RichEdit1, установив свойство RichEdit1:

PopupMenu = PopupMenu1.

Окно плагина является дочерним, следовательно, оно не должно иметь рамку и заголовок. Для этого надо переопределить виртуальную функцию CreateParams класса TCustomForm. Здесь, мы кроме настройки стилей окна:

Params.Style = WS_CHILD | WS_MAXIMIZE & !WS_CAPTION & !WS_BORDER;

зарезервируем память для хранения указателя на нашу форму:

Params.WindowClass.cbWndExtra = sizeof(void *);

Указатель нужен функции HideRTF для корректного закрытия плагина. В функции ShowRTF мы сохраняем указатель в WinAPI структуре окна плагина следующим вызовом:

SetWindowLong(fmMain->Handle, GWL_USERDATA, (LONG)p);

Позднее мы вытащим указатель из структуры, используя дескриптор нашего окна, который является параметром HideRTF, вызывая функцию GetWindowLong:

GetWindowLong(PluginWin, GWL_USERDATA);

Чтобы создать дочернее окно воспользуемся статической функцией CreateParentedControl класса TWinControl, т.е. в теле функции функция ShowRTF воспользуемся следующим оператором:

fmMain = (TfmMain *)(TWinControl::CreateParentedControl(__classid(TfmMain), ListerWin));

Для работы плагина нам понадобятся следующие данные: дескрипторы окон Тотал Командира и Листера, и режим работы плагина: в обычном окне или на одной из двух панелей Тотал Командира (так называемый Quick View - режим быстрого просмотра). Дескрипторы нужны, чтобы избежать краха по клавишам выхода Alt+X и для реагирования на быстрые клавиши Листера. Эти данные будем хранить, соответственно, в переменных TotCmdWin, ParentWin и QuickView. Добавим их определения в public раздел класса формы в файле unMain.h. Дескриптор окна Тотал Командира мы можем найти по имени класса этого окна (это не VCL класс!) с помощью WinAPI функции FindWindow.

Немного теорий. Особенностью библиотеки визуальных компонентов Borland VCL является ис-пользование глобального объекта "приложение" - Application. Этот Application имеет скрытое окно, которое должно быть владельцем всех окон приложения, что обеспечивает корректное поведение всех окон программы. И DLL библиотека плагина, и исполняемый EXE файл Тотал Командира имеют собственный глобальный объект Application, следовательно, требуется их синхронизация. Для этого надо присвоить дескриптор скрытого окна объекта Application исполняемого файла к дескриптору объекта Application библиотеки. К сожалению, Тотал Командир, хотя он написан на Delphi и использует все удобства и прелести VCL, не передает нам дескриптор данного скрытого окна. (Может причиной этого является проблема версии компиляторов Delphi?). За неимением оно-го, вместо него будем использовать для синхронизации дескриптор окна Листера, в противном слу-чае, наше модальное окно (например, окно About) поведет себя неестественно, оно появится на панели задач Windows. Эта синхронизация является задачей для функции ShowRTF.

Чтобы защитить, Тотал Командир от сбоев плагина, будем использовать событие OnException объ-екта Application, которое перехватывает необработанное исключение. Кинем на форму компонент ApplicationEvents, переименуем его на App и создаем обработчик события OnException, куда введем вызов функции MessageBox для выдачи сообщения о сбое. Сохранив проект и модуль, можно уда-лить из формы ненужный компонент ApplicationEvents. Установка адреса обработчика события в Application.OnException также является задачей для функции ShowRTF.

Все готово для ShowRTF? Увы, "маленькая неточность" в Plugin API Тотал Командира (включая v.6.02) значительно усложняет нашу работу:

Если пользователь откроет окно плагина, затем переключится на Тотал Командир и закроет Тотал Командир, то мы не получим вызов через ListCloseWindow для завершения своей работы. Вместо этого Тотал Командир или Листер (кто его знает?) уничтожает наше окно вызовом WinAPI функции DestroyWindow, а потом, то же самое попытается сделать наш объект Application, в конечном счете плагин вылетает с нарушением защиты памяти (General Protection Fault)!

Если мы не будем делать вышеописанную синхронизацию, этой проблемы удалось бы избежать. Что ж, будем расплачиваться за это и поставим ловушку для перехвата сообщений, которое получа-ет наше же окно, подобно змее, которая пожирает себя за свой собственный хвост! Не будем вда-ваться в подробности Windows API (кому же он нравиться?), вкратце суть дела такова.

Объявляем структуру TPlugInfo, где будем хранить данные, которые нужны для закрытия плагина. При инициализации выделяем память под эту структуру и заполняем ее. Определяем функцию HookDestroy, который будет перехватывать оконные сообщения, чтобы среагировать на сообщение WM_DESTROY (уничтожение окна). Вызовом SetWindowLong(…, GWL_WNDPROC, …) подменя-ем стандартный обработчик оконных сообщений на функцию HookDestroy. Похожим вызовом SetWindowLong в функции завершения HideRTF обратно восстанавливаем прежний обработчик.

Важно то, что когда функция HookDestroy поймает сообщение WM_DESTROY, она вызывает функцию завершения HideRTF точно так же, как это делает функция ListCloseWindow. В результате мы всегда успеваем нормально закрыть окно и убрать за собой, что, к примеру демонстрирует free(p) из HideRTF, освобождая память, выделенную в ShowRTF.

Остается создать диалоговую форму About, обработчики контекстного меню и обработчик RichEdit1KeyDown, который ловит нажатие специальных клавиш и передает их с помощью PostMessage в соответствующее окно. Если здесь не перехватывать клавиши Alt+X, это приведет к краху плагина. Причем, здесь придется удерживать фокус ввода в RichEdit1, проверяя режим рабо-ты плагина, т.е. значение переменной QuickView.

Об отладке и тестировании плагина.

Листер имеет встроенную возможность просмотра RTF файлов, поэтому перед запуском плагина надо отключить ее, сняв пометку у флага RTF в окне Configure Lister.

Чтобы использовать интегрированный отладчик IDE BCB, закройте Total Commander, а в BCB через меню "Run/Parameters" откройте диалог и в поле Host Application введите путь к Total Commander с помощью кнопки [Browse]. Теперь можно запускать плагин из-под BCB.

Ссылка для скачивания архива с примером здесь

PS. Уважаемый Читатель! Программирование - многовариантно и я никак не претендую на абсо-лютную истину. В качестве дополнительного материала, предлагаю Вам ознакомиться с исходными текстами плагина xBaseView - "Просмотр DBF, DB, MDB, ADO и ODBC баз данных", который предоставляется с исходными текстами, и где применяется аналогичный подход.

PPS. Прошу Читателя-Полиглота помочь мне перевести статью на английский язык, чтобы послать ее Кристиану Гислеру, автору знаменитого файл менеджера Тотал Командир, с призрачной надеж-дой, что он предпримет какие-то шаги навстречу нам - VCL программистам.

Е. Савич
19.03.04
© Mutex Ltd.
mutex@nm.ru

Комментарии пользователей

AdrianSmimi
Листер плагин на Borland C++ Builder 6 для начинающих 16.05.2021 - 09:23
Лучшие мастера для смены замка. Сколько стоит замена замков? Цена услуг такого типа в нашей компании начинается от 1 рублей, что вполне доступно, если рассматривать рынок в .
Замена замков в металлической двери имеет свои особенности — установить любое подходящее замочное устройство не получится. Обычно устанавливают сувальдные и цилиндровые механизмы. Замки отличаются высокой секретностью, простотой обслуживания, обеспечивают надежную защиту дома или квартиры. Несмотря на высокую степень защиты, они могут поломаться. Если отремонтировать невозможно, нужно сменить старый замок входных железных дверей на новый. Замена замков в металлической двери с выездом мастера на дом - услуга, которую выполняет наша компания. Мастера работают круглосуточно и без выходных, они срочно приедут на вызов через 20 минут. Сколько стоит и что входит в стоимость сервиса? Одна из частых ситуаций — потеря ключей. Даже если замок входной двери исправный, в целях безопасности лучше его заменить. Вызвать мастера понадобится, если замки изначально были установлены с перекосом. В этом случае поломка неизбежна, дверной замок выйдет из строя. Кроме того, придется поменять замок железной двери, для открытия которого использовались подручные инструменты или было вскрытие замков грубыми методами. Заменить замок в двери придется из-за износа его деталей с течением времени. Поменять замки также необходимо при покупке или аренде помещения у старого владельца. Популярная причина обращения жителей Москвы и Московской области — решение проблем со взломостойкостью. Усилить надежность металлических входных дверей от взлома можно путем замены запорного устройства на модель, которая имеет более высокую степень секретности. Часто перед тем, как заменить замок железной двери, приходится решать вопрос со вскрытием дверной конструкции. Отсутствие специальных навыков и инструментов для аккуратного вскрытия двери становится причиной разрыва обшивки, появления вмятин и царапин на коробке и полотне. Крепление дверных замков в металлическом блоке выполняется за счет резьбовых отверстий определенного диаметра. Одно неосторожное движение при замене замков может повлечь обрыв креплений и вряд ли можно будет починить его. Для решения этой проблемы потребуется вызывать специализированный сервис, с выездом мастера и менять его обойдется дороже. На стандартные стальные или алюминиевые двери устанавливают дверные замки цилиндрового и сувальдного типа. Замену замка этих типов можно быстро выполнить, подобрав для вставки аналогичную модель. В межкомнатное деревянное, ПВХ, металл или комбинированное полотно как правило можно поставить стандартные защелки. При необходимости выполнения работ в металлических дверях владельцы квартир, домов, офисов обращаются к специалистам нашей компании. Какими преимуществами пользуются наши клиенты? Если нужно заменить замок в металлической двери — звоните нам! Вызов мастера круглосуточный! Замена замка на входной металлической двери мастером из этой компании выполнена качественно. Все работает без нареканий. На проведенные работы мастер выдал талон на гарантийное обслуживание сроком на 3 г. Сервис понравился. Нужна была замена замка. Договорились на выезд мастера из этой службы. Специалист приехал оперативно, привез с собой несколько изделий. Произвел его установку на место сломанного. На работу и фурнитуру выдал гарантию от производителя. Решили сменить замки, обратились в эту службу — остались очень довольны услугой! Замена замка произведена быстро, без повреждения двери. Будем обращаться еще, если потребуется. Оставить свой отзыв Все отзывы. Вскрытие автомобилей. Перекодировка замка. Замена замков. Приезд в нужное время в любой район Москвы. Доступные цены от рублей. Вызвать мастера. Замена замков металлической двери в Москве и МО. Мастера-профессионалы меняют механизмы на любых дверях Качество услуг подкрепляется гарантией на замки и работы Набор механизмов обеспечивает решение за 1 приезд Замена замков в металлической двери имеет свои особенности — установить любое подходящее замочное устройство не получится. Цены на замену. Замена личинки замка от р. Накладных замков от р. Цилиндровых замков от р. Сувальдных замков от р. Электронных замков от р. Замена мебельного замка от р. Навесные замки от р. Биометрические замки от р. Ремонт замков от р. Отправить заявку. Когда требуется срочная замена дверного замка? Самостоятельная замена замка на входной металлической двери Часто перед тем, как заменить замок железной двери, приходится решать вопрос со вскрытием дверной конструкции. Профессионально заменим замки входной двери При необходимости выполнения работ в металлических дверях владельцы квартир, домов, офисов обращаются к специалистам нашей компании. Наши мастера приедут по заявке в течение 20 минут или замена дверных замков может быть сделана в удобное для клиента время. Наши специалисты аккуратно выполнят замену, быстро подберут аналог, который можно сразу купить, ведь на вызов мастера привозят с собой более устройств популярнейших брендов Master Lock, DOM, Atra, Securemme, Cisa. У сотрудника для замены есть и дополнительные элементы фурнитуры — ручки, накладки, планки и другие комплектующие, чтобы вставить их в дверное полотно и усилить его от взлома. Оказываем полный спектр услуг замочного сервиса, такие как: ремонт , установка замков , перекодировка , замена личинки замка , смена дверных ручек , замену броненакладки , уплотнителей двери. Другие наши услуги: врезка замков и др. Стоимость замены замков металлических дверей не меняется в процессе работы. На цену влияет тип и производитель двери - Стал, Форпост, Union и т. Все работы с замками мастера выполняются качественно, что подтверждает официальная гарантия. Наши партнеры. Вскрытие всех марок авто. География нашей работы.

металлические двери ремонт: podolsk.locks-master.ru
AdrianSmimi
Листер плагин на Borland C++ Builder 6 для начинающих 6.05.2021 - 00:12
Вставка замков. Вставка замка в дверь металлическую, железную, стальную дверь. Вставить замки с выездом мастера с подбором вариантов от фирмы ООО Барс-Х.
Переживаете о безопасности имущества? Решили усилить входную железную дверь? Хотите закрывать квартиру на надежные замки с защитой от взлома? Тогда рекомендуем вызвать мастера и вставить хороший замок в металлическую дверь. Специалисты посоветуют надежный механизм с отличными охранными свойствами, и затем грамотно его установят. Чтобы стальное полотно служило гарантом вашей безопасности, необходимо вставить в него взломостойкий механизм. В целях экономии денег многие владельцы квартир пользуются услугами незнакомых слесарей по объявлению. Однако риск слишком велик. Грамотно вставить замок в железную или стальную дверь без повреждений сможет только проверенный мастер, а не дилетант. Технология установки замков — довольно сложная процедура. Порой возникают серьезные сложности с монтажом замка, который не вставляется в старое посадочное место из-за несовпадения размеров. Поэтому лучше сразу избавить себя от рисков, и заказать вызов мастера на квартиру. Наши сотрудники подбирают по размеру и вставляют врезные, сувальдные или цилиндровые замки в железные двери от лучших зарубежных и российских брендов по обоснованным ценам, согласно прайс листу. Прежде чем обратиться к мастеру, жители квартир в Москве интересуются последовательностью работ по установке замка в металлическую дверь. Услуга состоит из нескольких этапов :. Конечно, лучше не проводить эксперименты с монтажом замка, а поручить комплекс работ проверенным мастерам. Они выезжают на квартиру заказчика после поступления заявки, причем в максимально удобное и оговоренное время. Хотите вставить замок в стальную, железную или металлическую дверь по акционной цене? Чувствуете себя не совсем безопасно в шумной Москве? Нам есть, что вам предложить! Оперативный выезд мастера, минимальные цены на монтаж замочно-скобяной продукции и бесплатные консультации — вот, что убедит вас в профессионализме наших сотрудников, и сделает вас нашими постоянными клиентами. Наши мастера выполнят заявки на вскрытие замков в квартире недорого. Гарантируем прибытие специалиста на срочное открытие дверей или вскрытие дверных замков в Москве в течение минут. Ремонт, установка дверного замка или замена замков в металлических дверях по низким ценам на дому. Вызов и выезд мастера бесплатно. Помните, поменять ключи необходимо, если вы сняли новую квартиру, чтобы исключить вероятность нахождения дубликатов у третьих лиц! Замена замков. Режим работы. Замена замков на дому. Вызвать мастера. Замена замков Металлической двери Входной двери Стальной двери. Установка замков На металлическую дверь На входную дверь В стальную дверь Установка броненакладок. Ремонт дверей Металлических Входных Стальных Ремонт петель. Обивка дверей Металлических Входных Деревянных Дверные панели. Дверные ручки Замена Установка Ремонт. Личинка замка Замена Установка Ремонт. Ремонт замков Металлической двери Входной двери Стальной двери. Замки Эконом-класса. Вскрытие замка. Ремонт дверей и замена замков в день обращения. Имеем официальные отношения с инженерными службами Москвы и Московской области. Установка замков. Вставить замок. Срочно вставить замок в железную дверь за один вызов мастера на дом Чтобы стальное полотно служило гарантом вашей безопасности, необходимо вставить в него взломостойкий механизм. Оставить заявку. Качественный ремонт, замена, монтаж замков с гарантией. Необходимо законно вскрыть дверь и заменить замок срочно? Раздаем бесплатно скидку рублей. Оформите заявку сейчас и назовите кодовое слово - безопасность. Абсолютно все замки известных брендов у мастеров при себе и в наличии на складе. Личинки Kale Турция. CISA Италия. KALE Турция. Мастер в каждом районе. Наши работы. Все новости. Замена броненакладки. Поставить хороший замок на дверь. Лучшие дверные ручки. САО, Ангарская улица, дом 49, корп. Все права защищены. Политика конфиденциальности.

ручка дверная ремонт: nikolskoe.locks-master.ru
non-prescriptoin vardenafil
Листер плагин на Borland C++ Builder 6 для начинающих 7.04.2021 - 02:20
self life of vardenafil https://vegavardenafil.com/ how long do the effects of vardenafil last
sildenafil tablet price
Листер плагин на Borland C++ Builder 6 для начинающих 4.04.2021 - 18:59
purchase sildenafil 20 mg https://eunicesildenafilcitrate.com/ cheap sildenafil 100mg
generic tadalafil
Листер плагин на Borland C++ Builder 6 для начинающих 4.04.2021 - 03:01
what is tadalafil https://elitadalafill.com/ tadalafil online
Все комментарии (23)
  Добавить ваш комментарий
Ваше имя:*
E-mail:
Ваш комментарий:
Сообщения содержащие крэки
будут удаляться
Контрольная сумма: 16 + 3 =

Рейтинги


Ramblers Top100

 




Все о Total Commander © 2001-2012
Идея, программирование, дизайн и поддержка, © Andrei Piasetski