Listing 4

(a)

#ifndef __PROFILER_H__
#define __PROFILER_H__

#include <windows.h>
#include "IMciEvents.h"

class Profiler : public IMciEvents  
{
public:
    // IMciEvents methods
    virtual void OnEnter(const std::string & filename, int lineNumber, 
                                                   const MethodInfo & mi);
    virtual void OnLeave(const std::string & filename, int lineNumber, 
                                                   const MethodInfo & mi);
private:
    DWORD   m_start;
};
#endif

(b)

#include "Profiler.h"
#include "MethodInfo.h"
#include <iostream>

using std::cout;
using std::endl;
using std::string;

void Profiler::OnEnter(const string & filename, int lineNumber, 
                                              const MethodInfo & mi)
{
    m_start = ::GetTickCount();
}

void Profiler::OnLeave(const string & filename, int lineNumber, 
                                              const MethodInfo & mi)
{
    DWORD duration = ::GetTickCount() - m_start;
    cout << endl << "Method '" << mi.className << "::" << mi.name << 
        "' took " << duration << " milli-seconds";
}