views:

48

answers:

1

I'm relatively new to Visual C++. I'm trying to build a module to consume log events generated by the IIS 7.0 server in order to be able to analyze these logs in real-time. I found a Microsoft article which provides code that accomplishes the real-time capture:


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


After some work, I've gotten this code to compile into a DLL on my machine (64-bit Windows XP with Visual Studio .NET 2008). I'm curious about the double initiation (?) of the m_hEventLog 'event viewer'. I've reproduced the constructor and the line in the private section which both seem to create a handle to the event viewer.

The constructor:

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

private:    
HANDLE m_hEventLog;

My question: Why does m_hEventLog need to be declared twice?

Thanks in advance,

-Eric

+1  A: 

This line:

private:
HANDLE m_hEventLog;

is declaration of the variable m_hEventLog. It means that when an object of type MyGlobalModule will be declared, that will contain a member named m_hEventLog. When the object is declared, or in other words, constructed, the constructor is called. It executes the following line:

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

The this line will execute, RegisterEventSource() will be called and its return value will be assigned to m_hEventLog.

EDIT

Consider the following program:

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;
}

When this program is executed, nothing actually happens for class A because there is no variable declared defined of type A. If the main() function is written in this way:

int main()
{
    A a;

    return 0;
}

then an object of type A is declared defined (provided that compiler didn't optimize anything). It hold an integer inside it (the member variable a). A's constructor will be called so that A is initialized. And the constructor will initialize A's a to 0. Note I used initializer list to initialize A::a.

Donotalo
The constructor will be executed for _defined_ variables. A variable that's only _declared_ (`extern A a`), will not cause a constructor to be called. See [this answer](http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration) for more info regarding what's a definition and what's a declaration.
sbi
@sbi: i'm a bit confused by the line "`The C++ standard considers struct x; to be a declaration`" from the post. Is `A a` a declaration or definition or both in my answer?
Donotalo
@Donato: `type obj;` is the _definition_ of an _object_ (variable). A _declaration_ of an _object_ would be `extern type obj`. `class X { ... };` is the _definition_ of a _class_. `class x;` is a _declaration_ of a _class_ (usually called a "forward declaration", but there are no other class declarations).
sbi
@sbi, uh! poor me. i was reading `struct x;` as `struct X x;`.
Donotalo