Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Использование ассемблера для оптимизации программ на С++ - Магда Ю.С.

Магда Ю.С. Использование ассемблера для оптимизации программ на С++ — БХВ-Петербург , 2004. — 496 c.
ISBN 5-94157-414-2
Скачать (прямая ссылка): ispolzovaniyaassemblera2004.djvu
Предыдущая << 1 .. 117 118 119 120 121 122 < 123 > 124 125 126 .. 127 >> Следующая

В случае остановки службы необходимо остановить и таймер. Это делается в обработчике события onstop. Далее представлен исходный текст класса ewservicewinservice, определяющего поведение нашей службы (листинг 15.4).
; Л»’сти>(!' 15.4. Исходный то нет класса Cwn*-: rio=v; i,nSes vice ¦pragma once
using namespace System; using namespace System:’.Collections; using namespace System::ServiceProcess; using namespace System::CcmponentModel;
¦include <windows.h>
¦include <stdio.h>
using namespace System::Runtime::InteropServices; [Dllimport("cw.dll")] extern "C" int countwords(char* path);
int cntWords; char buf[64]; int ibuf;
namespace CWService {
Глава 15. Оптимизация процедурно-ориентированных приложений..
471
III <summary>
III Summary for CWServiceWinService .
Ill </summary>
III
III WARNING: If you change the name of this class, you will need to III change the
///'Resource File Name' property for the managed resource compiler tool ///associated with all .resx files this class depends on. Otherwise, ///the designers will not be able to interact properly with localized ///resources associated with this form.
public ___gc class CWServiceWinService : <P
public System::ServiceProcess::ServiceBase {
public:
CWServiceWinService()
(
InitializeComponent();
}
III <summary>
III Clean up any resources being used.
Ill </summary>
void Dispose(bool disposing)
{
if (disposing && components)
{
components->Dispose();
}
super::Dispose(disposing);
}
protected:
/// <summary>
III- Set things in motion so your service can do its work.
Ill </summary>
void OnStart(String* args[])
{
// TODO: Add code here to start your service.
472________Часть III. Встроенный ассемблер Visual C++ .NET2003 и его использование
timerl->Enabled = true;
}
III <summary>
III Stop this service.
Ill </summary> void OnStopO (
11 TODO: Add code here to perform any tear-down necessary // to stop your service.
timerl->Enabled = false;
}
private: System::Diagnostics::EventLog * eventLogl; private: System: .‘Timers::Timer * timerl;
private:
III <summary>
III Required designer variable.
Ill </summary>
System::ComponentModel::Container ^components;
III <summary>
III Required method for Designer support - do not modify
III the contents of this method with the code editor.
Ill </summary> void InitializeComponent(void)
{
this->eventLogl = new System::Diagnostics::EventLog(); this->timerl = new System::Timers::Timer();
(__try_cast<System::ComponentModel::ISupportlnitialize * ><^
(this->eventLogl))->BeginInit();
(__try_cast<System::ComponentModel::ISupportlnitialize * ><P
(this->timerl))->BeginInit();
II
11 eventLogl 11
this->eventLogl->Source = S"CWService";
//
Глава 15. Оптимизация процедурно-ориентированных приложений..
473
// timer1 //
this->timerl->Interval =¦ 10000; this->timerl->Elapsed += new <P System::Timers::ElapsedEventHandler(this, timerl_Elapsed);
//
11 CWServiceWinService //
this->CanPauseAndContinue = true; this->ServiceName = S"CWService";
( try_cast<System::ComponentModel::ISupportlnitialize * ><P
(this->eventLogl))->EndInit();
( try_cast<System::ComponentModel::ISupportlnitialize * ><?
(this->timerl))->EndInit();
}
private: System::Void timerl_Elapsed(System::Object * sender, System::Timers::ElapsedEventArgs * e)
{
ibuf = sprintf(buf, "%s", "Number of words in file = "); cntWords = countwords ("d: Wtestfile") ; sprintf(buf + ibuf, "%d", cntWords); eventLogl->WriteEntry("CWService", (LPSTR)buf);
}
};
}
Даже при беглом взгляде на листинг возникает вопрос: где же функция, выполняющая обработку файла? Эту функцию я поместил в библиотеку динамической компоновки cw.dll и назвал countwords. Функция написана на ассемблере и выполняет подсчет слов в файле. Подключение DLL к службе выполнено с помощью строк:
using namespace System::Runtime::InteropServices;
[Dllimport("cw.dll")] extern "O’* int countwords (char* path)
474
Часть III. Встроенный ассемблер Visual C++ .NET2003 и его использование
Подсчет слов и вывод результата в журнал регистрации выполняются в обработчике события таймера:
ibuf = sprintf(buf, "%s", "Number of words in file = "); cntWords = countwords ("d: Wtestfile"); sprintf(buf + ibuf, "%d", cntWords); eventLogl->WriteEntry("CWService", (LPSTR)buf);
Для подсчета слов выбран небольшой текстовый файл с именем test file. Количество слов, как было сказано, вычисляется функцией countwords из библиотеки cw.dll, а затем запоминается в переменной cntWords. Отформатированная строка с результатом отображается в журнале приложений.
Исходный текст программного кода библиотеки динамической компоновки cw.dll представлен в листинге 15.5.
// cw.cpp : Defines the entry point for the DLL application.
# include "s tda fx.h"
¦include <windows.h>
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID IpReserved
)
{
return TRUE;
}
extern "C" ____declspec(dllexport) int countwords(char* path)
{
HANDLE hln;
DWORD bytesRead, lenFile; int cntWords = 0; char buf[2048];
Предыдущая << 1 .. 117 118 119 120 121 122 < 123 > 124 125 126 .. 127 >> Следующая