Класс c++ враппер поверх функции WinMain/функции DllMain


Я написал некоторый код, чтобы сделать работу для меня. Окончательные результаты, кажется, работает нормально, но я хотел бы знать, если это, как я должен обрабатывать классы. И где я могу улучшить или вещи, которые просто глупо.

class CInit
{
public:
    CInit();
    ~CInit();

    void Check(bool);

    virtual bool Init();
    virtual bool ExInit();

private:
    static CInit* _ThisInit;
};
CInit* CInit::_ThisInit;

CInit::CInit()
{
    if(_ThisInit == 0)
        _ThisInit = this;
}

CInit::~CInit()
{

}

void CInit::Check(bool bStart)
{
    if(bStart)
        _ThisInit->Init();
    else
        _ThisInit->ExInit();
}

bool CInit::Init()
{
    return true;
}

bool CInit::ExInit()
{
    return true;
}

Это мой класс cInit, как вы можете видеть это имеет статическое значение, потому что, когда в программу execetues это будет первый запуск глобальный экземпляр класса, который будет использоваться такой. Это будет перегружать init() и там программа начинается.

    CRaPE mycp;

bool CRaPE::Init()
{
    return true;
}

bool CRaPE::ExInit()
{
    return true;
}

Программа запускается отсюда:

CInit* _Init;

void HandleStartUp()
{
     _Init = new CInit();
    _Init->Check(true); // So Init gets called
}

void HandleExit()
{
    _Init->Check(false); // so ExInit gets called
    delete _Init;
}

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  
    DWORD fdwReason,    
    LPVOID lpReserved )  
{
    switch( fdwReason ) 
    { 
    case DLL_PROCESS_ATTACH:
        {
            HANDLE hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)HandleStartUp,0,0,0);
            if(hThread == 0)
                return false;
        }
        break;

    case DLL_THREAD_ATTACH:     
        break;

    case DLL_THREAD_DETACH:
        break;

    case DLL_PROCESS_DETACH:
        HandleExit();
        break;
    }
    return TRUE;  
}

Надеюсь, я хорошо объяснил, спасибо за чтение.

ГЗ



794
7
c++
задан 21 августа 2011 в 09:08 Источник Поделиться
Комментарии
2 ответа

лучше явно вызвать метод init и exinit, чем пройти bool, чтобы "проверить", чтобы сказать, что вы звонили. может быть, назвать их "старт" и "выход"

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

public: bool Start();
protected: virtual bool StartImpl();

void CInit::Start()
{
StartImpl();
}

Это дает вам немного больше контроля над звоню в ваш API. (Также в основном рекомендуется для C++).

Это называется "виртуальный интерфейс" или "Навои". У него есть плюсы и минусы. Но в данном случае я думаю, что это будет весьма полезно.

1
ответ дан 22 августа 2011 в 07:08 Источник Поделиться

Извините, но на данный момент это не совсем ясно, что вы пытаетесь достичь с помощью этого кода. Зачем вам нужна такая запутанная схема инициализации? Что такое класс крепом и что он должен делать с остальным кодом?

Кроме того, согласно правилам языка Си++, идентификаторы, начинающиеся с символа подчеркивания и прописной буквы, зарезервированы в любой области и, следовательно, такие имена, как _ThisInit и _Init не должны быть использованы.

0
ответ дан 21 августа 2011 в 09:08 Источник Поделиться