Запутался в использовании 'HANDLE' в куске кода Visual C ++ для ведения журнала событий в реальном времени IIS 7.0 - PullRequest
0 голосов
/ 08 октября 2010

Я относительно новичок в Visual C ++.Я пытаюсь создать модуль для использования событий журнала, сгенерированных сервером IIS 7.0, чтобы иметь возможность анализировать эти журналы в режиме реального времени.Я нашел статью Microsoft, которая предоставляет код, который выполняет захват в реальном времени:


http://learn.iis.net/page.aspx/581/advanced-logging-for-iis-70---real-time-logging#module


После некоторой работы я получил этот код для компиляции вDLL на моем компьютере (64-битная Windows XP с Visual Studio .NET 2008).Мне любопытно двойное инициирование (?) M_hEventLog 'просмотра событий'.Я воспроизвел конструктор и строку в приватном разделе, которые, похоже, создают дескриптор для средства просмотра событий.

Конструктор:

MyGlobalModule()    
{       
    m_hEventLog = RegisterEventSource( NULL, L"IISADMIN" );    
}

private:    
HANDLE m_hEventLog;

Мой вопрос: почемунужно ли объявлять m_hEventLog дважды?

Заранее спасибо,

-Eric

1 Ответ

1 голос
/ 08 октября 2010

Эта строка:

private:
HANDLE m_hEventLog;

является объявлением переменной m_hEventLog. Это означает, что когда будет объявлен объект типа MyGlobalModule, он будет содержать член с именем m_hEventLog. Когда объект объявлен или, другими словами, создан , вызывается конструктор. Он выполняет следующую строку:

m_hEventLog = RegisterEventSource( NULL, L"IISADMIN" );

Эта строка будет выполнена, будет вызван RegisterEventSource(), и ее возвращаемое значение будет присвоено m_hEventLog.

EDIT

Рассмотрим следующую программу:

class A
{
public:
    A() : a(0) {}

    int get_a() const {return a;}
    void set_a(int na) {a = na;}

private:
    int a;
};

int main()
{
    return 0;
}

Когда эта программа выполняется, на самом деле ничего не происходит для class A, поскольку никакой переменной не объявлено , определенной для типа A . Если функция main() написана следующим образом:

int main()
{
    A a;

    return 0;
}

тогда объект типа A объявлен определен (при условии, что компилятор ничего не оптимизировал). Внутри него содержится целое число (переменная-член a). Конструктор A будет вызываться для инициализации A. И конструктор инициализирует A a в 0. Примечание. Я использовал список инициализатора для инициализации A::a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...