0

私は、VC2010 と混合 MFC/Win32 を使用してフレームワークを作成しています。いくつかのコントロール タイプがあり、それらはすべて独自のウィンドウ クラスを登録します。そのうちのいくつかは、次の例のように、標準ウィンドウ クラスのいずれかの WindowProc を使用します。

void Button::OnInitClass(WNDCLASS &wndClass)
{       
    Object::OnInitClass(wndClass);
    if(!GetClassInfo(NULL, WC_BUTTON, &wndClass)) {
        throw std::exception("Failed getting window class info.");
    }
    wndClass.lpszClassName = ButtonBase::GetWndClassName();
}

bool Button::Create(CWnd* parent)
{
    if(!WndClassInitialized) {
        static VSCriticalSection cs;
        cs.Enter();
        if(!WndClassInitialized) {
            WNDCLASS wndClass;
            memset(&wndClass, 0, sizeof(WNDCLASS));
            OnInitClass(wndClass);
            assert(wndClass.lpszClassName);
            if(!RegisterClass(&wndClass)) {
                throw std::exception("Error registering window class");
            }
            WndClassInitialized = true;
        }
        cs.Leave();
    }

    DWORD style =   WS_CHILD | WS_CLIPSIBLINGS | BS_PUSHBUTTON | BS_MULTILINE;
    DWORD exStyle = WS_EX_LEFT | WS_EX_LTRREADING;      
    Created = CWnd::CreateEx(exStyle, ButtonBase::GetWndClassName(), "", style , _attribAnchor.Rect, parent, 0) != FALSE;       
    SetFont(_font);
    return Created;
}

それはすべて長い間機能していましたが、今ではヒープが破損しています。ただし、CreateEx 呼び出しで WC_BUTTON クラスを直接使用すると、ヒープが破損することはありません。

WC_BUTTON から WindowProc を使用するウィンドウ クラスを登録するこの方法が安全かどうかは疑問です。それは...ですか?

安全である場合、当然のことながら、他の場所でヒープの破損の経路を探す必要があります。しかし、そうでない場合、私がやろうとしていることを安全に行う方法はありますか? (つまり、既存のクラスを新しい名前で登録します。これは、任意のウィンドウ ハンドルを指定して、ウィンドウ クラス名からコントロールを認識できるようにするために行います)

文字列の割り当てでヒープの破損が発生し、すべてのパラメーターが正しいように見えることを言及する必要があります。したがって、問題はその前のどこかにあるに違いありません。

前もってありがとう、マーティン

4

1 に答える 1

0

MFC/Win32 を混在させるとさらに悪化するのではないかと心配しています。メイン フレームワーク/SDK が MFC である場合、MFC のルールとスタイルに従ってみませんか? AfxRegisterClass の代わりに ::RegisterClass を使用する理由 (はるかに単純です)。単なる UI コントロールのためにすべての異なるクラスを登録するのはなぜですか?

通常の MFC プログラムは、ポップアップ ウィンドウまたはトップレベル ウィンドウの新しいウィンドウ クラスのみを登録します (AfxRegisterClass による)。MFC CWnd は、その目的のために基本的な WndProc を提供します。カスタム デザインのボタン コントロールが必要な場合は、ウィンドウのサブクラス化メカニズムを使用できます。

于 2013-01-22T09:00:56.277 に答える